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

Java中如何为字段动态数据类型场景创建兼容的POJO类

动态JSON响应(单/多地址字段)POJO兼容解决方案

方案1:使用Jackson反序列化(Java生态最常用方案)

Jackson 2.7+版本提供了开箱即用的注解支持,无需自定义复杂逻辑:

  • 首先定义基础的Address POJO类:
import lombok.Data; // 可选,用lombok简化getter/setter代码,无lombok自行补充get/set方法即可
@Data
public class Address {
    private Integer houseNo;
    private String streetName;
    private String city;
    private String state;
    private String country;
}
  • 然后定义用户主POJO类,将address字段定义为List<Address>类型,添加@JsonAcceptSingleValueAsArray注解:
import com.fasterxml.jackson.annotation.JsonAcceptSingleValueAsArray;
import lombok.Data;
import java.util.List;

@Data
public class User {
    private String firstName;
    private String lastName;
    private String profession;
    // 核心注解:支持单个JSON对象自动转为单元素List
    @JsonAcceptSingleValueAsArray
    private List<Address> address;
}

这个注解的作用就是当反序列化时遇到单个JSON对象,会自动封装为仅包含一个元素的List集合,同时原生兼容多地址的数组场景,不用额外处理。
如果你不想在字段上加注解,也可以全局开启Jackson的反序列化配置,全局生效后所有字段遇到单对象转集合的场景都会自动适配:

ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

方案2:使用Gson反序列化的解决方案

如果你用的是Gson库,需要自定义一个TypeAdapter来处理单/多类型的适配:

import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class AddressListTypeAdapter extends TypeAdapter<List<Address>> {
    private final Gson gson = new Gson();

    @Override
    public void write(JsonWriter out, List<Address> value) throws IOException {
        gson.toJson(value, new TypeToken<List<Address>>(){}.getType(), out);
    }

    @Override
    public List<Address> read(JsonReader in) throws IOException {
        List<Address> list = new ArrayList<>();
        // 判断当前字段是对象还是数组
        if (in.peek() == JsonToken.BEGIN_OBJECT) {
            // 单个对象的情况,解析后加入列表
            Address address = gson.fromJson(in, Address.class);
            list.add(address);
            return list;
        }
        // 数组的情况,正常遍历解析
        in.beginArray();
        while (in.hasNext()) {
            Address address = gson.fromJson(in, Address.class);
            list.add(address);
        }
        in.endArray();
        return list;
    }
}

然后在User类的address字段上添加@JsonAdapter注解指定这个适配器即可:

import com.google.gson.annotations.JsonAdapter;
// 其他注解省略
private List<Address> address;

补充说明

如果序列化时需要把单元素List转回单个对象,可对应自定义序列化器实现,Jackson使用@JsonSerialize指定序列化器,Gson扩展上述TypeAdapter的write方法即可。其他语言的适配逻辑一致:判断字段类型,单对象自动封装为集合结构处理即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 18:27:03