第三方服务JSON的List字段类型不一致致Java反序列化异常的解决咨询
解决建议
方案1:配置Jackson全局特性
若使用Jackson作为JSON序列化/反序列化库,可通过开启两项全局特性兼容两种格式:
ObjectMapper objectMapper = new ObjectMapper(); // 允许将单个对象(含空对象{})视作数组元素 objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); // 将空对象{}反序列化为null,Jackson会自动将null转为空List objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_OBJECT_AS_NULL);
配置后,空对象格式的list会被转为空列表,非空数组则正常反序列化。
方案2:针对list字段自定义反序列化器
如果全局配置会影响其他字段,可单独为list字段编写反序列化逻辑:
- 实现自定义反序列化器:
public class FlexibleListDeserializer extends JsonDeserializer<List<Response<?>>> { @Override public List<Response<?>> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { JsonNode node = p.getCodec().readTree(p); if (node.isArray()) { return p.getCodec().treeToValue(node, new TypeReference<List<Response<?>>>() {}); } else if (node.isObject() && node.size() == 0) { return Collections.emptyList(); } throw new MismatchedInputException(p, "list字段格式不符合预期"); } }
- 在实体类字段上关联该反序列化器:
@Getter @Setter public class Response<T> { // 其他字段... @JsonDeserialize(using = FlexibleListDeserializer.class) private List<Response<T>> list; private int total; }
方案3:临时修改字段类型手动转换
若不想改动序列化配置,可先将list字段类型改为Object,再通过工具方法手动转换:
@Getter @Setter public class Response<T> { // 其他字段... private Object list; private int total; @SuppressWarnings("unchecked") public List<Response<T>> getNormalizedList() { if (list == null) { return Collections.emptyList(); } if (list instanceof List) { return (List<Response<T>>) list; } // 空对象格式直接返回空列表 return Collections.emptyList(); } }
业务代码中通过getNormalizedList()获取统一格式的列表即可。
内容的提问来源于stack exchange,提问作者Sha
相关产品推荐
相关产品推荐

