当前位置: 首页 > 面试题库 >

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

卢阳成
2023-03-14
问题内容

我想将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);


 类似资料:
  • 文档中只有嵌套在其他对象中的映射/集合的示例,因此您可以执行以下操作: 但是,当地图格式位于文档的根目录时,如何定义它呢?

  • 我试图将上面的文件加载到一个映射中,实体部分下的数据将映射到实体对象的集合。当我得到yaml解析器错误时,这是正确的yaml语法吗。

  • 是否有任何方法可以使用java编辑/删除YAMLfile中的值。 我正在使用struts2-jquery-grid,其中数据将从YAML文件中填充。现在,如果我编辑字段,它应该保存在YAML文件中。我能够分别使用yaml.load()和yaml.dump()从YAML格式的文件中读取值并将值写入文件。但是,我没有任何想法来编辑和删除特定的字段。 我经历过http://code.google.com

  • 考虑以下代码: 我唯一发现的是: dump(Object data)方法接受Java对象并生成YAML文档 和 是只有我一个人,还是文档感觉非常神秘和指定?其中一半是关于我甚至从未听说过的特殊应用。我只看着它就觉得自己很傻,这让我有点生气。 不管怎样;如果你能给我任何帮助,我将不胜感激。

  • 当我将Bean字段切换到public时,所有工作都很好,但我真的想使用getter和setter(最好是由Lombok生成的)。

  • 我在这方面遇到了很多麻烦。我定义了构造函数,我可以让它导入一个文档,但不是两个。我得到的错误是: 有了一个include,Snakeyaml很高兴找到一个EOF并处理导入。有了两个,就不开心了(上图)。 我的java源代码是: 问题是,有没有人对蛇蟹做过类似的事情?有没有想过我做错了什么?