Java中JsonArray添加多个JsonObject仅保留最后一个对象的问题
问题根因
代码逻辑存在两处核心错误,导致最终数组只保留最后一个对象:
javax.jsonAPI提供的JsonArray属于不可变集合:通过数组构造器调用build()方法生成的JsonArray实例一旦创建完成,就不支持新增、删除、修改内部元素。- 循环赋值逻辑完全错误:你写的
convertToJSONArray方法每次调用时,都会新建一个独立的数组构造器,仅传入当前的单个JsonObject就直接build成长度为1的新数组,再把这个新数组直接赋值给jsonArray变量。相当于每次循环都把上一轮生成的数组直接丢弃,替换成只装了当前对象的新数组,循环结束后变量里自然只存了最后一次生成的单元素数组。
修正方法
不要在每次循环里新建数组构造器,把构造器初始化放到循环外面,循环过程中持续往同一个构造器追加对象,等所有元素都添加完成后,再统一调用build()生成最终的JsonArray即可。
你可以直接删掉TestRun里那个每次新建数组的convertToJSONArray方法,把主方法逻辑调整为如下代码:
TestRun testRun; Faker faker = new Faker(); // 循环外初始化唯一的数组构造器 JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); for (int i = 0; i < 2; i++) { testRun = new TestRun(faker.name().firstName(), faker.number().numberBetween(1, 200)); JsonObject jsonObj = testRun.convertToJSONObject(); // 往同一个构造器中追加当前生成的对象 arrayBuilder.add(jsonObj); } // 所有元素添加完成后,统一构建最终数组 JsonArray jsonArray = arrayBuilder.build(); System.out.println(jsonArray);
注意:
javax.json下的所有Builder类都是一次性生成不可变实例的设计,不管是对象构造器还是数组构造器,调用build()后产出的Json对象/数组就完全固定。如果需要批量组装元素,一定要在所有元素都添加完成后再调用build(),不要提前build再尝试修改生成的不可变实例。
内容的提问来源于stack exchange,提问作者iTchTheRightSpot
相关产品推荐
相关产品推荐

