Jackson反序列化兼容单个对象与对象列表时报错的解决方案求教
错误根因
你当前的实现思路本身存在问题:Jackson不允许将同一个JSON字段同时映射到多个不同类型的Java类字段。反序列化时遇到ns:return字段,会优先尝试匹配到先声明的字段,如果返回值类型和字段类型不匹配就直接抛出异常,不会再尝试匹配第二个字段,因此无论你两个字段的顺序怎么调整,总有一种场景会触发类型不匹配的报错。
解决方案
直接开启Jackson的ACCEPT_SINGLE_VALUE_AS_ARRAY特性即可,无需声明两个字段,仅保留List<CreditCardDetails>类型的字段就能同时兼容单个对象和数组两种返回格式。
方案1:局部字段配置(仅对当前字段生效,推荐)
修改GetCreditCardInfo类代码如下:
@Data @AllArgsConstructor @NoArgsConstructor @JsonIgnoreProperties(ignoreUnknown = true) @JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class) public final class GetCreditCardInfo { @JsonAlias("ns:return") // 开启单值自动转数组特性 @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) private List<CreditCardDetails> details; // 无需自定义get方法,Jackson会自动完成类型适配 }
该配置下:
- 当接口返回数组格式的
ns:return时,details会被反序列化为正常的多元素列表 - 当接口返回单个对象格式的
ns:return时,Jackson会自动将对象封装为只有一个元素的列表赋值给details
方案2:全局ObjectMapper配置(对所有反序列化操作生效)
如果你的项目中存在多个需要兼容单值/数组的场景,可以直接修改全局ObjectMapper的配置,省去每个字段加注解的麻烦:
ObjectMapper objectMapper = new ObjectMapper(); // 全局开启单值自动转数组特性 objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
开启后所有List类型的字段都支持自动将单个返回值封装为列表。
内容的提问来源于stack exchange,提问作者iamjoshua
相关产品推荐
相关产品推荐

