【问题标题】:Deserialise Yaml List of Objects反序列化 Yaml 对象列表
【发布时间】:2020-11-06 21:41:52
【问题描述】:

我有一个 yaml 文件,其中的数据如下所示:

dog:
  animalId: dog00
  animalName: Dog
  animalFamily: Canidae
cat:
  animalId: cat00
  animalName: Cat
  animalFamily: Felidae
elephant:
  animalId: elpnt
  animalName: Elephant
  animalFamily: Elephantidae
...

(更新:我无法控制 yaml 文件)

如何将其反序列化为 Java 中的 'animal' 对象列表?

我的Animal 班级看起来像这样

public class Animal {
   private String animalId;
   private String animalName;
   private String animalFamily;

   // getters, setters, constructors
}

我正在尝试如下使用杰克逊

ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
CollectionType listType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, Animal.class);

List<Animal> animals = mapper.readValue(new File("src/main/resources/animals.yaml"), listType);

但我得到了错误

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of 'java.util.ArrayList<Animal>' out of START_OBJECT token

【问题讨论】:

    标签: java spring jackson yaml deserialization


    【解决方案1】:

    您的 YAML 定义与您的对象模型不匹配。

    YAML 定义描述了 Animal 的 Map,而您的对象模型需要 Animal 的 List。

    尝试将您的 YAML 文件更改为:

    -
      animalId: dog00
      animalName: Dog
      animalFamily: Canidae
    -
      animalId: cat00
      animalName: Cat
      animalFamily: Felidae
    -
      animalId: elpnt
      animalName: Elephant
      animalFamily: Elephantidae
    

    或者尝试更改您的 Java 代码,使其反序列化为 Map&lt;String, Animal&gt;。

    Map<String, Animal> animals = mapper.readValue(new File("src/main/resources/animals.yaml"), new TypeReference<Map<String, Animal>>(){});
    

    【讨论】:

    • 我刚刚阅读了您的更新,即无法更改 YAML 输入。好的,没问题。在这种情况下,我们必须更改 Java 代码,使其与 YAML 模型匹配。您可以尝试反序列化为Map&lt;String, Animal&gt; 而不是ArrayList?
    • 解散到Map&lt;String, Animal&gt; 就可以了!谢谢!!
    猜你喜欢
    • 2013-08-21
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多