You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:49:12