Jackson操作JsonNode向ArrayNode添加新项所有值均相同问题
问题原因
- 引用复用问题:代码全程操作的都是从原数组取出的同一个
arrayObject对象引用,Jackson的JsonNode属于可变对象,循环中每次修改field1的值都是覆盖同一个对象的属性,循环结束后该对象的field1最终为xxxxxxxxx2,数组中所有指向该对象的元素自然都显示为最后一次修改的值。 - 数组操作逻辑错误:循环中调用
((ObjectNode) node).putArray("item3")会直接覆盖node中原有的item3字段,创建全新的空数组,后续addAll操作属于多余的错误逻辑。
修复方案
每次循环时对原始对象做深拷贝生成独立的新对象,再修改属性添加到数组,同时删除重复创建数组的错误逻辑,修正后代码如下:
String request = "{\n" + " \"item1\": 123,\n" + " \"item2\": \"desc 1\",\n" + " \"item3\": [{\"field1\": \"desc 1\", \"field2\": \"desc 2\"}]\n" + "}"; ObjectMapper mapper = new ObjectMapper(); JsonNode node = mapper.readTree(request); ArrayNode inputArrayNode = (ArrayNode) node.findValue("item3"); // 取出原始对象作为模板,清空原有数组内容 JsonNode templateObj = inputArrayNode.get(0); inputArrayNode.removeAll(); for (int i = 0; i < 3; i++) { // 深拷贝生成全新独立对象,避免引用复用 ObjectNode newObj = templateObj.deepCopy(); newObj.put("field1", "xxxxxxxxx" + i); inputArrayNode.add(newObj); }
运行上述代码即可输出预期的JSON结果。
内容的提问来源于stack exchange,提问作者Shabar
相关产品推荐
相关产品推荐

