编程语言
首页 > 编程语言> > java – 使用snakeYaml在根目录下解析带有映射的YAML文档

java – 使用snakeYaml在根目录下解析带有映射的YAML文档

作者:互联网

我想将YAML文档读取到自定义对象的地图(而不是地图,默认情况下是snakeYaml所做的).所以这:

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

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

Map<Integer, Item>

其中项目是:

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

我找不到使用snakeYaml做到这一点的方法,我也找不到更好的任务库.

该文档仅包含嵌套在其他对象中的maps / collections的示例,以便您可以执行以下操作:

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

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

解决方法:

您需要添加自定义Constructor.但是,在您的情况下,您不希望注册“item”或“item-list”标记.

实际上,您希望将Duck Typing应用于您的Yaml.它不是超级高效的,但有一种相对简单的方法可以做到这一点.

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,java,yaml
来源: https://codeday.me/bug/20191001/1838740.html