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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:48:02