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

Gson如何扁平化数组的冗余对象包装,复用已有的Model类?

以下是可行的实现方案,均不需要修改现有业务逻辑中对People类的使用:

方案1:使用JSON序列化框架自定义通用反序列化器(推荐,性能最优,侵入性低)

以Java生态常用的Jackson框架为例,实现一个可同时兼容普通数组、entries包裹数组的通用反序列化器,直接给需要适配的列表字段加上注解即可:

  1. 实现通用列表反序列化器:
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.type.CollectionType;
import java.io.IOException;
import java.util.List;

public class WrappedListDeserializer<T> extends JsonDeserializer<List<T>> {
    private final CollectionType listType;

    public WrappedListDeserializer(CollectionType listType) {
        this.listType = listType;
    }

    @Override
    public List<T> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        JsonNode node = p.getCodec().readTree(p);
        // 匹配服务A返回的直接数组结构
        if (node.isArray()) {
            return p.getCodec().treeToValue(node, listType);
        }
        // 匹配服务B返回的entries包裹结构
        if (node.isObject() && node.has("entries")) {
            return p.getCodec().treeToValue(node.get("entries"), listType);
        }
        return null;
    }
}
  1. 给People类的列表字段加上反序列化注解:
public class People {
    public String name;
    public int id;
    // 仅需加这一行注解,剩余9个同类型列表字段加相同注解即可
    @JsonDeserialize(using = WrappedListDeserializer.class)
    public List<Contact> contact;

    public static class Contact {
        public String type;
        public String number;
    }
}

如果所有的List类型字段都需要做兼容,可以把这个反序列化器全局注册到Jackson的ObjectMapper中,不需要给每个字段加注解。


方案2:JSON预处理适配

在调用服务B拿到返回结果后,先对JSON做一次转换,把所有被entries包裹的列表替换为实际数组,再统一解析为People类:

  • 可以用JsonPath批量匹配所有*.*[?(@.entries)]节点,直接替换为节点内的entries值
  • 该方案完全不需要修改Model类、序列化框架配置,适合不想侵入现有序列化逻辑的场景

方案3:Gson框架适配

如果项目使用Gson做序列化,逻辑和方案1一致,自定义TypeAdapter实现两种结构的兼容处理即可。


内容的提问来源于stack exchange,提问作者Pixel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:45:09