Java序列化对象如何生成含三个attribute项的JSON数组?
问题根源
你之所以只得到最后一个EndDate的attribute项,核心原因是复用了同一个Column对象实例。Java里对象是引用类型,你每次修改attribute属性,只是改变了这个实例的属性值,而列表里始终只存了这一个实例的引用。最后序列化时,自然只会输出这个实例最后一次被设置的attribute值。
解决方案
必须为每个要生成的attribute项创建独立的Column对象,不能复用同一个实例。
错误写法(你之前的逻辑)
Column column = new Column(); List<Column> columns = new ArrayList<>(); column.setAttribute("FTOS"); column.setAttribute("StartDate"); column.setAttribute("EndDate"); columns.add(column); // 只加了一次,最终只有EndDate生效
正确写法
基础写法
List<Column> columns = new ArrayList<>(); // 为每个attribute新建Column实例 Column ftosCol = new Column(); ftosCol.setAttribute("FTOS"); columns.add(ftosCol); Column startDateCol = new Column(); startDateCol.setAttribute("StartDate"); columns.add(startDateCol); Column endDateCol = new Column(); endDateCol.setAttribute("EndDate"); columns.add(endDateCol);
简化写法(用流或循环)
如果要处理的attribute数量多,可以用循环或者Stream API减少重复代码:
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; // 先定义所有需要的attribute List<String> attrList = Arrays.asList("FTOS", "StartDate", "EndDate"); // 逐个生成Column实例并收集到列表 List<Column> columns = attrList.stream() .map(attr -> { Column col = new Column(); col.setAttribute(attr); // 如果有其他共同属性,比如设置默认宽度 // col.setWidth(120); return col; }) .collect(Collectors.toList());
进阶:用工厂方法封装
如果Column还有其他固定默认属性,可以给Column类加个工厂方法,简化对象创建:
public class Column { private String attribute; private int width; // 示例其他属性 // getter、setter、构造器省略 // 工厂方法,快速创建带指定attribute的Column实例 public static Column of(String attribute) { Column col = new Column(); col.setAttribute(attribute); col.setWidth(120); // 设置默认宽度 return col; } }
使用时就更简洁:
List<Column> columns = Arrays.asList( Column.of("FTOS"), Column.of("StartDate"), Column.of("EndDate") );
内容的提问来源于stack exchange,提问作者Pratik
相关产品推荐
相关产品推荐

