【问题标题】:Edit object in nested array in json object with JsonNode使用 JsonNode 编辑 json 对象的嵌套数组中的对象
【发布时间】:2020-11-28 12:48:40
【问题描述】:

我试图在下面的 json 中将嵌套数组项 "field2": "desc 2" 中的对象编辑为 "field2": "xxxx"

{
  "item1": 123,
  "item2": "desc 1",
  "item3": [
    {
      "field1": "desc 1",
      "field2": "desc 2"
    }
  ]
}

我试过这个solution

root = objectMapper.readTree(new File(filePath))
((ObjectNode) root).put("field2", "desc xxxx");

输出是:

{
  "item1": 123,
  "item2": "desc 1",
  "item3": [
    {
      "field1": "desc 1",
      "field2": "desc 2"
    }
  ],
  "field2": "desc xxxx"
}

【问题讨论】:

  • 您正在根节点中编辑获取item3 节点,它是第一个对象并编辑root.get("item3").get(0)
  • 这工作((ObjectNode) root.get("item3").get(0)).put("field2", "xxxx");

标签: java json jackson jsonnode


【解决方案1】:

先访问包装好的数组,再修改第0个元素:

JsonNode root = objectMapper.readTree(new File(filePath));
ObjectNode item3element0 = (ObjectNode) root.get("item3").get(0);
item3element0.put("field2", "desc xxxx");

...或者构造一个ArrayNode,向其中添加元素,然后将其添加到根:

JsonNode root = objectMapper.readTree(new File(filePath));
ArrayNode newArr = objectMapper.createArrayNode();
ObjectNode field2Element = objectMapper.createObjectNode();
field2Element.put("field2", "desc xxxx");
newArr.add(field2Element);
root.set("item3", newArr);

【讨论】:

  • 我们可以在这里使用 ((ObjectNode)root).putArray("item3")....吗?
  • 当然,如果您想输入一个空的ArrayNode 并通过它进行添加,这将起作用。或者,您可以从头开始构造一个ArrayNode 并以这种方式修改它。可能还有其他一些方法可以做到这一点。
【解决方案2】:

使用 ObjectMapper 和 JsonNode 更新 json(复杂 json(json 数组和对象) *

解决方案:

String json= "{\n" +
        "  \"item1\": 123,\n" +
        "  \"item2\": \"desc 1\",\n" +
        "  \"item3\": [{\"field1\": \"desc 1\", \"field2\": \"desc 2\"}]\n" +
        "}";
try {
    JsonNode node;
    ObjectMapper mapper = new ObjectMapper();
    node = mapper.readTree(json);
    node.get("item3").forEach(obj -> {
        ((ObjectNode)obj).put("field2", "xxxxxxxxxxxxxx");
    });
    System.out.println(node);
} catch (JsonMappingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (JsonProcessingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

结果:

{"item1":123,"item2":"desc 1","item3":[{"field1":"desc 1","field2":"xxxxxxxxxxxxxx"}]}

【讨论】:

    猜你喜欢
    • 2019-08-11
    • 1970-01-01
    • 2020-09-12
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2021-08-25
    相关资源
    最近更新 更多