You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

第三方服务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字段编写反序列化逻辑:

  1. 实现自定义反序列化器:
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字段格式不符合预期");
    }
}
  1. 在实体类字段上关联该反序列化器:
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 02:18:23