使用Jackson反序列化树形结构JSON遇MismatchedInputException问题
解决Jackson反序列化递归树形JSON的问题
先来说说你遇到的两个核心问题,以及对应的修复方案:
1. 反序列化目标类型不匹配(触发MismatchedInputException的直接原因)
你的示例JSON根节点是单个Person对象(开头是{),但你却尝试把它反序列化成List<Person>,这就导致Jackson看到START_OBJECT标记时,却期望一个ArrayList对应的START_ARRAY([),自然抛出异常。
修正后的反序列化代码:
String jsonString = Files.readString(Paths.get("/path_to/file.json")); Person rootPerson = objectMapper.readValue(jsonString, Person.class);
2. Person类的构造函数存在拼写错误
你的Person类里有两个明显的错误,会导致Jackson无法正确实例化对象:
@JsonCreator标注的构造函数名写成了Project,应该和类名一致为Person- 构造函数内部错误地给
coordinates赋值(你的类里根本没有这个字段),应该改为this.parent = parent
修正后的Person类代码:
import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; public class Person { private String name; private Person parent; private List<Person> children; @JsonCreator public Person(@JsonProperty("name") String name, @JsonProperty("parent") Person parent, @JsonProperty("children") List<Person> children) { this.name = name; this.parent = parent; // 修正赋值错误 this.children = children; } // 补充必要的getter/setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public Person getParent() { return parent; } public void setParent(Person parent) { this.parent = parent; } public List<Person> getChildren() { return children; } public void setChildren(List<Person> children) { this.children = children; } }
额外提示:递归结构的Jackson支持
Jackson默认完全支持递归嵌套的对象反序列化,只要你的类结构和JSON字段对应正确,不需要额外配置。修正上面两个问题后,你的代码就能正常把树形JSON反序列化成Person对象了。
内容的提问来源于stack exchange,提问作者cesarsotovalero
相关产品推荐
相关产品推荐

