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

时间:2019-05-17 13:50:49

标签: java snakeyaml

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

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

与上面链接中的问题的不同之处在于,我的顶层结构是列表,而不是自定义对象。

1 个答案:

答案 0 :(得分:0)

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

function handleInputChange() {
    var inputValue = document.getElementById("input-id").value;
    var options = document.getElementById("list-id").childNodes;
    for (var i = 0; i < opts.length; i++) {
      if (options[i].value === inputValue) {

        // Send to DB - options[i].attributes.value

        console.log(options[i].attributes.value)
        break;
      }
    }
  }

,然后在构造Yaml时使用它:

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