使用snakeYaml解析YAML文档和根目录下的映射

我想将YAML文档读取到自定义对象的映射(而不是map,默认情况下snakeYaml会这样做)。所以这:

19:

typeID: 2

limit: 300

20:

typeID: 8

limit: 100

将被加载到如下所示的地图中:

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);

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

回答:

您需要添加一个自定义的Constructor。但是,您不想注册“

item”或“ item-list”标签。

实际上,您想对Yaml 应用Duck

Typing。它不是超级高效,但是有一个相对简单的方法可以做到这一点。

class YamlConstructor extends Constructor {

@Override

protected Object constructObject(Node node) {

if (node.getTag() == Tag.MAP) {

LinkedHashMap<String, Object> map = (LinkedHashMap<String, Object>) super

.constructObject(node);

// If the map has the typeId and limit attributes

// return a new Item object using the values from the map

...

}

// In all other cases, use the default constructObject.

return super.constructObject(node);

以上是 使用snakeYaml解析YAML文档和根目录下的映射 的全部内容, 来源链接: utcz.com/qa/402666.html

回到顶部