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

基于带嵌套数组的JSON构造Java POJO时序列化返回空数组问题排查

问题根因分析

你序列化后object字段输出空数组的核心原因是:仅初始化了外层List容器,没有主动往容器中添加构造完成的子对象实例,Jackson序列化时会直接输出空集合。同时你的POJO代码存在多处命名不匹配、规范问题,也可能引发序列化异常。

具体错误点
  • 子对象未主动填充:你在Notification类中仅初始化了空的List容器,没有添加object类的实例,序列化自然返回空数组。
  • 属性名与Getter/Setter不匹配:Jackson默认基于Getter/Setter命名做字段映射,Notification类中的属性名为sampleObject,但对应的Getter为getObject,会导致序列化字段名异常或属性匹配失败;同理object类中sampleObject2和getObject2也存在相同问题,且sampleObject2初始赋值为null,就算添加了object实例,嵌套的object2字段也会输出异常。
  • 类命名不符合Java规范:自定义类名使用小写的object、object2,极易和java.lang.Object混淆,也不符合Java大驼峰的类命名规范,可能引发未知异常。
修复方案

1. 修正POJO代码,统一命名和初始化逻辑

// 最外层Notification类
public class Notification {
    private String field = "sample value";
    // 属性名和JSON字段名、Getter/Setter保持一致,使用规范类名
    private List<ObjectItem> object = new ArrayList<>();

    public String getField() {
        return field;
    }

    public void setField(String field) {
        this.field = field;
    }

    public List<ObjectItem> getObject() {
        return object;
    }

    public void setObject(List<ObjectItem> object) {
        this.object = object;
    }
}

// 原object类,改为大驼峰命名
public class ObjectItem {
    private String field2 = "string";
    // 初始化列表,属性名和JSON、Getter对应
    private List<Object2Item> object2 = new ArrayList<>();

    public String getField2() {
        return field2;
    }

    public void setField2(String field2) {
        this.field2 = field2;
    }

    public List<Object2Item> getObject2() {
        return object2;
    }

    public void setObject2(List<Object2Item> object2) {
        this.object2 = object2;
    }
}

// 嵌套的object2对应类
public class Object2Item {
    private String field3 = "string";
    private Object3Item object3 = new Object3Item();

    public String getField3() {
        return field3;
    }

    public void setField3(String field3) {
        this.field3 = field3;
    }

    public Object3Item getObject3() {
        return object3;
    }

    public void setObject3(Object3Item object3) {
        this.object3 = object3;
    }
}

// 最内层object3对应类
public class Object3Item {
    private String code = "string";
    private String proprietary = "string";

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getProprietary() {
        return proprietary;
    }

    public void setProprietary(String proprietary) {
        this.proprietary = proprietary;
    }
}

2. 序列化时主动填充子对象实例

ObjectMapper mapper = new ObjectMapper();
Notification test = new Notification();
// 构造子对象并添加到对应列表
ObjectItem objectItem = new ObjectItem();
Object2Item object2Item = new Object2Item();
objectItem.getObject2().add(object2Item);
test.getObject().add(objectItem);
// 可开启格式化输出方便调试
mapper.enable(SerializationFeature.INDENT_OUTPUT);
String jsonInString = mapper.writeValueAsString(test);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:09:04