基于带嵌套数组的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
相关产品推荐
相关产品推荐

