java - 如何使用 SnakeYaml 加载自定义对象列表

标签 java snakeyaml

我一直在尝试将以下 yaml 反序列化为 List<Stage>使用 SnakeYaml:

- name: Stage1
  items: 
    - item1
    - item2

- name: Stage2
  items: 
    - item3

public class Stage {
    private String name;
    private List<String> items;

    public Stage() {
    }

    public Stage(String name, List<String> items) {
        this.name = name;
        this.items = items;
    }

    // getters and setters
}

我发现的最接近的问题是 SnakeYaml Deserialise Class containing a List of Objects .
看完之后,我才知道ConstructorTypeDescriptor类,但我仍然无法让它工作(我得到的是 HashMaps 列表,而不是 Stages)。

与上面链接中的问题不同的是,我的顶级结构是一个列表,而不是一个自定义对象。

最佳答案

一种方法是像这样创建自己的snakeyaml构造函数:

public class ListConstructor<T> extends Constructor {
  private final Class<T> clazz;

  public ListConstructor(final Class<T> clazz) {
    this.clazz = clazz;
  }

  @Override
  protected Object constructObject(final Node node) {
    if (node instanceof SequenceNode && isRootNode(node)) {
      ((SequenceNode) node).setListType(clazz);
    }
    return super.constructObject(node);
  }

  private boolean isRootNode(final Node node) {
    return node.getStartMark().getIndex() == 0;
  }
}

然后在构建 Yaml 时使用它:
final Yaml yaml = new Yaml(new ListConstructor<>(Stage.class));

关于java - 如何使用 SnakeYaml 加载自定义对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56187845/

相关文章:

java - 从文件读取数组元素时出现 NullPointerException 错误 - Java

java - 如何在 Bukkit 中以 UTF-8 编写配置

java - Java 中的 SnakeYAML 演练

java - 从一个类到另一个类使用 JTextField

java - 如何解决Error : java. lang.ClassNotFoundException : io.netty.util.concurrent.GenericFutureListener?

java - 什么是 setElementConverter 以及它在 Selenium WebDriver 中如何工作?

java - 使用 SnakeYAML Java 将用户添加到 yml 文件作为嵌套在 block 序列中的 block 映射

java - 在保留注释的同时在 java 中修改 YAML

java - 如何更改 snakeyaml 中的隐式类型(int 到 double)

java - oracle sql 替换 "in"进行高级查询