本文介绍在 jackson 中仅通过注解(不使用 typereference、自定义反序列化器或显式集合类型)将形如 [{“name”:”a”},{“name”:”b”}] 的数组型 json 直接反序列化为含 list 字段的 java 封装类(如 getpersonsresponsedto)的可靠方案。
Jackson 默认要求 JSON 结构与目标类结构严格匹配:若 JSON 以数组(START_ARRAY)开头,而目标类是普通 POJO(非集合类型),则会抛出 JsonMappingException: Can not deserialize instance of … out of START_ARRAY token。要绕过这一限制并纯靠注解实现,核心思路是让 Jackson 将整个 JSON 数组“当作构造函数参数传入”,而非尝试匹配字段名。
✅ 正确做法是:为封装类添加一个带 @JsonCreator 注解的单参构造函数,该参数类型为 List,并在构造函数中完成字段赋值:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
public class GetPersonsResponseDto {
public List<Person> persons;
// ✅ 关键:用 @JsonCreator 告诉 Jackson ——
// 当遇到数组时,将整个数组作为此构造函数的参数传入
@JsonCreator
public GetPersonsResponseDto(List<Person> persons) {
this.persons = persons;
}
// ⚠️ 必须保留无参构造函数(Jackson 反序列化内部可能需要)
public GetPersonsResponseDto() {
this.persons = List.of(); // 或 new ArrayList<>()
}
}
// Person 类保持简洁(字段名与 JSON key 一致即可)
public class Person {
public String name;
}
此时,以下代码可直接工作: