Java Jackson反序列化同字段多类型(对象/数组)报错如何解决
方案1:字段级配置空数组转Null(推荐,无需全局改动)
Jackson 2.9及以上版本支持直接在目标字段加@JsonFormat注解,指定空数组自动转为Null,完全匹配你的场景:
@Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = false) class Structure { private String code; // 新增这一行注解即可 @JsonFormat(with = JsonFormat.Feature.ACCEPT_EMPTY_ARRAY_AS_NULL) private Sth structure; } @Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = false) class Sth{ private String sth; }
加完注解后,当接口返回Error、structure是空数组时,反序列化后Structure类的structure字段会自动设为Null;返回Success时则正常解析为Sth对象,完全不需要修改其他逻辑。
方案2:全局配置(适用于Jackson低版本/多处有同类场景)
如果你的Jackson版本低于2.9,或者项目中有多处类似的字段类型不兼容场景,可以直接给ObjectMapper开启全局配置:
ObjectMapper mapper = new ObjectMapper(); // 全局开启:空数组对应对象类型时自动转为Null mapper.enable(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT);
注意这个配置会对所有反序列化操作生效,如果仅需要处理structure这一个字段,优先用方案1即可。
可选方案:自定义反序列化器(需特殊处理时使用)
如果需要空数组返回时structure字段是初始化的空Sth对象而非Null,可以自定义Sth类型的反序列化器单独处理逻辑,按需选择即可。
内容的提问来源于stack exchange,提问作者Young User
相关产品推荐
相关产品推荐

