gpt4 book ai didi

java - 使用 snakeYaml 在根部解析带有映射的 YAML 文档

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:15:02 25 4
gpt4 key购买 nike

我想将 YAML 文档读取到自定义对象的映射(而不是 snakeYaml 默认执行的映射)。所以这个:

19:
typeID: 2
limit: 300
20:
typeID: 8
limit: 100

将加载到如下所示的 map 中:

Map<Integer, Item>

项目在哪里:

class Item {
private Integer typeId;
private Integer limit;
}

我找不到使用 snakeYaml 执行此操作的方法,我也找不到更好的库来完成这项任务。

文档中只有映射/集合嵌套在其他对象中的示例,因此您可以执行以下操作:

    TypeDescription typeDescription = new TypeDescription(ClassContainingAMap.class);
typeDescription.putMapPropertyType("propertyNameOfNestedMap", Integer.class, Item.class);
Constructor constructor = new Constructor(typeDescription);
Yaml yaml = new Yaml(constructor);
/* creating an input stream (is) */
ClassContainingAMap obj = (ClassContainingAMap) yaml.load(is);

但是本地图格式位于文档的根目录时,我该如何定义它呢?

最佳答案

这是我在非常相似的情况下所做的。我只是将我的整个 yml 文件放在一个选项卡上,并在顶部添加了一个 map: 标签。所以对于你的情况就是这样。

map:
19:
typeID: 2
limit: 300
20:
typeID: 8
limit: 100

然后在您的类中创建一个静态类来读取此文件,如下所示。

static class Items {
public Map<Integer, Item> map;
}

然后只需使用即可阅读您的 map 。

Yaml yaml = new Yaml(new Constructor(Items));
Items items = (Items) yaml.load(<file>);
Map<Integer, Item> itemMap = items.map;

更新:

如果您不想或不能编辑您的 yml 文件,您可以在读取文件时用类似这样的代码执行上述转换。

try (BufferedReader br = new BufferedReader(new FileReader(new File("example.yml")))) {
StringBuilder builder = new StringBuilder("map:\n");
String line;
while ((line = br.readLine()) != null) {
builder.append(" ").append(line).append("\n");
}

Yaml yaml = new Yaml(new Constructor(Items));
Items items = (Items) yaml.load(builder.toString());
Map<Integer, Item> itemMap = items.map;
}

关于java - 使用 snakeYaml 在根部解析带有映射的 YAML 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28551081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com