使用snakeYaml解析根有地图的YAML文档

Parsing a YAML document with a map at the root using snakeYaml(使用snakeYaml解析根有地图的YAML文档)
本文介绍了使用snakeYaml解析根有地图的YAML文档的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

限时送ChatGPT账号..

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

I want to read a YAML document to a map of custom objects (instead of maps, which snakeYaml does by default). So this:

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

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

Would be loaded to a map which looks like this:

Map<Integer, Item>

项目在哪里:

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

我找不到使用snakeYaml 的方法,也找不到更好的库来完成这项任务.

I could not find a way to do this with snakeYaml, and I couldn't find a better library for the task either.

文档仅包含嵌套在其他对象中的地图/集合的示例,因此您可以执行以下操作:

The documentation only has examples with maps/collections nested inside other objects, so that you can do the following:

    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 格式位于文档的根目录时,我该如何定义它呢?

But how do I go about defining the Map format when it is at the root of the document?

推荐答案

你需要添加一个自定义构造函数.但是,在您的情况下,您不想注册项目"或项目列表"标签.

You need to add a custom Constructor. However, in your case you don't want register an "item" or "item-list" tag.

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

In effect, you want to apply Duck Typing to your Yaml. It's not super efficient, but there is a relatively easy way to do this.

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文档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How to send data to COM PORT using JAVA?(如何使用 JAVA 向 COM PORT 发送数据?)
How to make a report page direction to change to quot;rtlquot;?(如何使报表页面方向更改为“rtl?)
Use cyrillic .properties file in eclipse project(在 Eclipse 项目中使用西里尔文 .properties 文件)
Is there any way to detect an RTL language in Java?(有没有办法在 Java 中检测 RTL 语言?)
How to load resource bundle messages from DB in Java?(如何在 Java 中从 DB 加载资源包消息?)
How do I change the default locale settings in Java to make them consistent?(如何更改 Java 中的默认语言环境设置以使其保持一致?)