在 java 中使用嵌套数组反序列化 YAML 文件

Deserialisation of YAML file with nested arrays in java

我正在尝试反序列化 Java 中的 Yaml 文件,但遇到了问题,因为它具有嵌套数组格式,如下例所示。

items.yml

ITEMS:
  - item1
  - item2
  - item3:
    - item4
    - item5
  - item6

我在这里使用 Jackson 对其进行反序列化,它在 item2 之前工作正常,但在反序列化 item3 时抛出以下异常:

com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.ymalParser.io.Item]: can not instantiate from JSON object (need to add/enable type information?)

我是这个反序列化的新手。 谁能帮我解决我在这里缺少的东西。

提前致谢..

您正在创建一个简单类型数组(item1、item2、item6)。但是 item3 是一个复杂类型。

ITEMS:
  - item1
  - item2
...

可以序列化为List<String>

ITEMS:
  - item1
  - item2
  - item3:
    - item4
    - item5
  - item6

无法序列化为 List<String>Map<String, List<Object>.

试试这个:

ITEMS:
  - item1: []
  - item2: []
  - item3:
    - item4
    - item5
  - item6: []

第二次编辑:

public void test() {
    ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
    Resource resource = new ClassPathResource("test.yaml");
    InputStream input = resource.getInputStream();
    Map<String, List<Object>> list = mapper.readValue(input, new TypeReference<Map<String, List<Object>>>() {});
    mapper.writeValue(System.out, list);
}

输出:

---
ITEMS:
- "item1"
- "item2"
- item3:
  - "item4"
  - "item5"
- "item6"

我不会提供答案,只是一个小提示:看看你的数据在转换为 JSON:

时的样子
{
   "ITEMS": [
      "item1",
      "item2",
      {
         "item3": [
            "item4",
            "item5"
         ]
      },
      "item6"
   ]
}

问题是ITEMS数组的元素类型不同:item1、item2、item6是字符串,第三项是对象。理论上它是有效的 YAML/JSON,但将它反序列化为 java 对象是有问题的。