如何使用 Jackson 更新复杂 JSON 数组中的值?

How to update values in a complicated JSON Array using Jackson?

我有一个请求正文(JSON 格式),如下所示:

[
  {
    "l_ts":0,
    "af":{
      "lib":"xyz",
      "OS":"abc",
      "wdt":"2.63",
    },
    "frs":false,
    "g":"-v4d89ae6885b14baf91b102caaefea245",
    "tlc":[],
    "type":"meta",
  },
  {
    "s":1643895073,
    "evtName":"CONTENT_LIKE_DISLIKE",
    "evtData":{
      "contentId":17189,
      "likeContent":true,
    },
    "type":"event",
    "n":"_bg"
  }
]

现在在发送请求之前,我需要更新“contentId”字段的值。我在我当前的项目中使用 Jackson,那么更新上面 JSON 中的“contentId”字段的最佳方法是什么。

这是我到目前为止尝试过的方法:

ObjectMapper om = new ObjectMapper();
JsonNode requestBody = om.readTree(new File(pathToJsonAbove));
JsonNode requestBodyNode = requestBody.get(1);
requestBodyNode = JsonUtil.put(requestBodyNode, "evtData", "contentId", newValue);
requestBody = JsonUtil.put(requestBody, "[1]", requestBodyNode); // getting error here

JsonUtil函数如下:

public static final JsonNode put(JsonNode node, String key1, String key2, int value) {
    JsonNode jsonNode = node.path(key1);
         put(jsonNode, key2, value);
         return node;
}

public static final JsonNode put(JsonNode node, String key, int value) {
    return ((ObjectNode)node).put(key, value);
}

public static final JsonNode put(JsonNode node, String key, JsonNode value) {
    return ((ObjectNode)node).putPOJO(key, value);
}

我无法成功地将我编辑的节点 (requestBodyNode) 放回 requestBody,它是包含整个正文的主要 JsonNode。当我 运行 上面的代码时,我得到一个 ClassCastException 说我不能从 ArrayNode 转换为 ObjectNode。

更新上面 JSON 中的“contentId”字段的最佳方法是什么?

如果您只需要更新 contentId 字段,您可以识别 contentId 节点的父节点并修改子节点(此外基本上你已经通过创建抛出错误的函数做了更多的事情):

ObjectMapper om = new ObjectMapper();
JsonNode requestBody = om.readTree(json);
JsonNode requestBodyNode = requestBody.get(1);
ObjectNode objectNode = (ObjectNode) requestBodyNode.get("evtData");
objectNode.put("contentId", 0); //<-- 0 chosen as the new value
//it will show contentId updated to 0
System.out.println(requestBody);