如何解决反序列化含子对象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
相关产品推荐
相关产品推荐

