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

如何解决反序列化含子对象JSON时的START_ARRAY token错误?

解决JSON反序列化时"Can not deserialize instance of person out of START_ARRAY token"错误

嘿,这个问题我之前踩过同款坑,咱们一步步捋清楚怎么搞定它~

错误原因解析

这个报错的核心其实很直白:你反序列化的目标类型和JSON的实际结构不匹配。从你给出的JSON和实体类来看,你的JSON是一个单独的person对象,但你大概率在反序列化时,错误地把它当成了List<person>类型来处理;反过来,如果JSON是数组但你用单个对象类型接收,也会触发这个错误。

具体解决方案

1. 匹配反序列化目标类型与JSON结构

你的JSON是单个person对象,所以反序列化时要指定目标类型为Person(先提一句:Java类名规范是首字母大写,建议把你的person类改成Person,避免不必要的命名问题)。以常用的Jackson库为例,正确的代码应该是:

// 先把类名修正为Person,符合Java命名规范
ObjectMapper mapper = new ObjectMapper();
Person person = mapper.readValue(yourJsonString, Person.class);

如果你的JSON其实是一个person数组(比如接口返回的是[{"id":"154", ...}, ...]这种格式),那就要用List<Person>来接收,代码如下:

List<Person> personList = mapper.readValue(yourJsonString, new TypeReference<List<Person>>() {});

2. 修正实体类的细节问题

你的实体类还有几个需要调整的点,能避免不少潜在问题:

  • 类名改成Person,严格遵循Java命名规范
  • children字段的泛型改成List<Person>,而不是List<person>
  • 确保实体类有无参构造函数(Jackson默认需要用它来创建对象),如果用Lombok的话可以加@NoArgsConstructor,手动写的话就加一个空的构造方法
  • 确认getter和setter方法都正确生成,Jackson依赖这些方法来读写字段

修正后的实体类大概是这样:

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

    // 无参构造函数
    public Person() {}

    // getter和setter方法
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public List<Person> getChildren() { return children; }
    public void setChildren(List<Person> children) { this.children = children; }
}

最后排查下常见小坑

有时候你可能会不小心搞错JSON的根节点——比如明明是单个对象,却误把接口返回的数组当成了单个对象,或者反过来。先打印下你的JSON字符串,确认它是{...}(单个对象)还是[{...}, {...}](数组),再对应调整反序列化的目标类型就好。

内容的提问来源于stack exchange,提问作者Jean

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:41:36