使用Jackson将复杂JSON反序列化为Java List<Tester>问题咨询
Jackson反序列化为指定泛型List的解决方案
问题根因
直接传入List.class作为反序列化目标类型时,受Java泛型擦除机制影响,Jackson无法识别List容器内的元素类型为Tester,会默认将JSON对象反序列化为LinkedHashMap实例,这就是你遇到类型不符合的核心原因。
具体修改步骤
1. 用TypeReference指定完整泛型类型
修改getCollection方法中的readValue调用,通过TypeReference传递完整的泛型类型信息,让Jackson能够正确识别元素类型为Tester:
// 首先引入TypeReference依赖 import com.fasterxml.jackson.core.type.TypeReference; public static List<Tester> getCollection() throws IOException { ObjectMapper mapper = new ObjectMapper(); // 仅保留findAndRegisterModules即可,已内置JavaTimeModule自动注册逻辑 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false) .findAndRegisterModules(); // 替换原有反序列化逻辑,指定泛型类型 List<Tester> tester = mapper.readValue(Paths.get("Tester.json").toFile(), new TypeReference<List<Tester>>() {}); return tester; }
2. 补充字段映射注解
你的Tester类字段名和JSON中的键名不一致,需要通过@JsonProperty注解指定映射关系,否则字段会反序列化失败为null:
class Tester { // 映射JSON中的entete键 @JsonProperty("entete") private entete header = entete.getHeader(); // 映射JSON中的pied-depage键 @JsonProperty("pied-depage") private pied-depage footer = pied-depage.getFooter(); private List<Elt> Corps; private Elt anlagengut; private String nomain; // 映射JSON中大小写不一致的daterRange键 @JsonProperty("daterRange") private LocalDateRange dateRange; private Map<String,Object> labels; // 缺失的labels字段需补充定义 public LocalDate getDate1() { return this.dateRange.getStart(); } public LocalDate getDate2() { return this.dateRange.getEndInclusive(); } // 确保所有字段都有对应getter、setter方法 }
3. 自定义类适配要求
所有涉及到的自定义类(entete、pied-depage、Elt、garantie、LocalDateRange等)都需要满足以下要求,否则会反序列化失败:
- 存在公共的无参构造方法
- 所有需要序列化/反序列化的字段都有对应的getter、setter方法,或字段上标注
@JsonProperty注解 - 类属性的嵌套结构与JSON结构完全匹配
4. 保证JSON格式合法性
你提供的示例JSON存在语法错误(键值对缺值、逗号缺失、括号不匹配等),实际用于反序列化的JSON需要保证语法合法,建议直接用当前程序Jackson序列化生成的JSON做反序列化测试,避免格式问题。
内容的提问来源于stack exchange,提问作者boris
相关产品推荐
相关产品推荐

