如何使用 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);
我有一个请求正文(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);