【问题标题】:How to serialize a JSON file with tree structure with Jackson如何使用 Jackson 序列化具有树结构的 JSON 文件
【发布时间】:2020-12-09 10:42:51
【问题描述】:

我需要将 JSON 文件序列化为 Java 对象。 JSON 文件具有树结构,这意味着根对象具有作为自身实例的子对象,依此类推。例如,考虑以下 JSON 文件:

{
  "name": "peter",
  "parent": null,
  "children": [
    {
      "name": "simon",
      "parent": "peter",
      "children": [
        {
          "name": "john",
          "parent": "simon",
          "children": []
        }
      ]
    },
    {
      "name": "javier",
      "parent": "peter",
      "children": []
    },
    {
      "name": "martin",
      "parent": "peter",
      "children": []
    }
  ]
}

我已经尝试使用 Jackson 库进行序列化。这是我要序列化的对象:

public class Person {
    
   private String name;
   private Person parent;
   private List<Person> children;

   @JsonCreator
   public Project(@JsonProperty("name") String name,
                  @JsonProperty("parent") Person parent,
                  @JsonProperty("children") List<Person> children) {
      this.name = name;
      this.coordinates = parent;
      this.children = children;
   }
    
   // getters, setters, and constructor
}

这是我迄今为止尝试过的:

String jsonString = Files.readString(Paths.get("/path_to/file.json"));
List<Person> listModel = objectMapper.readValue(jsonString, new TypeReference<>() {});

但是,它会触发以下MismatchedInputException: Cannot deserialize instance of java.util.ArrayList&lt;Person&gt; out of START_OBJECT token

【问题讨论】:

  • 检查文件是否包含 Person 的实际 JSON 数组。它似乎可能包含一个 JSON 人物对象
  • 在顶层你有JSON Object。尝试像这样反序列化它:objectMapper.readValue(jsonString, Person.class)

标签: java json jackson json-serialization


【解决方案1】:

无法从 START_OBJECT 令牌中反序列化 java.util.ArrayList 的实例。 因为你的 json 文件是 Person 对象而不是 List 对象

【讨论】:

  • 包装成 [] 可能会有所帮助
  • @Konstantin Pribluda 这绝对有帮助。我将Person 类中的children 属性更改为数组,将listModel 更改为Person,它可以工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 2022-10-15
相关资源
最近更新 更多