如何在 Java 中修改 JsonNode?

我需要在 Java 中修改 JSON 属性的值,我可以得到正确的值,但是我不能修改 JSON。

下面是代码

  JsonNode blablas = mapper.readTree(parser).get("blablas");
for (JsonNode jsonNode : blablas) {
String elementId = jsonNode.get("element").asText();
String value = jsonNode.get("value").asText();
if (StringUtils.equalsIgnoreCase(elementId, "blabla")) {
if(value != null && value.equals("YES")){
// I need to change the node to NO then save it into the JSON
}
}
}

最好的方法是什么?

204483 次浏览

您需要获取 ObjectNode类型对象来设置值。 看看这篇文章

JsonNode是不可变的,用于解析操作。然而,它可以投射到 ObjectNode(和 ArrayNode)允许突变:

((ObjectNode)jsonNode).put("value", "NO");

对于数组,可以使用:

((ObjectNode)jsonNode).putArray("arrayName").add(object.ge‌​tValue());

我认为您可以直接强制转换到 ObjectNode 并使用 put方法

ObjectNode o = (ObjectNode) jsonNode; Put (“ value”,“ NO”) ;

只是为了了解其他人谁可能没有得到整个图片清楚下面的代码工程找到一个字段,然后更新它

ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(JsonString);
JsonPointer valueNodePointer = JsonPointer.compile("/GrandObj/Obj/field");
JsonPointer containerPointer = valueNodePointer.head();
JsonNode parentJsonNode = rootNode.at(containerPointer);


if (!parentJsonNode.isMissingNode() && parentJsonNode.isObject()) {
ObjectNode parentObjectNode = (ObjectNode) parentJsonNode;
//following will give you just the field name.
//e.g. if pointer is /grandObject/Object/field
//JsonPoint.last() will give you /field
//remember to take out the / character
String fieldName = valueNodePointer.last().toString();
fieldName = fieldName.replace(Character.toString(JsonPointer.SEPARATOR), StringUtils.EMPTY);
JsonNode fieldValueNode = parentObjectNode.get(fieldName);


if(fieldValueNode != null) {
parentObjectNode.put(fieldName, "NewValue");
}
}

@ Sharon-Ben-Asher 的答案是 OK。

但在我的例子中,对于数组我必须使用:

((ArrayNode) jsonNode).add("value");

在添加一个答案时,其他一些人在接受的答案的注释中投了赞成票,他们在试图强制转换到 ObjectNode (包括我自己)时得到了这个异常:

Exception in thread "main" java.lang.ClassCastException:
com.fasterxml.jackson.databind.node.TextNode cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode

解决方案是获取“父”节点并执行 put,有效地替换整个节点,而不管原始节点类型如何。

如果需要使用节点的现有值“修改”节点:

  1. get JsonNode的值/数组
  2. 对该值/数组执行修改
  3. 继续对父进行 put调用。

代码,目标是修改 subfield,它是 NodeANode1的子节点:

JsonNode nodeParent = someNode.get("NodeA")
.get("Node1");


// Manually modify value of 'subfield', can only be done using the parent.
((ObjectNode) nodeParent).put('subfield', "my-new-value-here");

图片来源:

我从 给你得到这个灵感,感谢 Wassgreen@

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> nodeMap = mapper.convertValue(jsonNode, new TypeReference<Map<String, Object>>(){});
nodeMap.put("key", "value");
jsonNode = mapper.convertValue(nodeMap, JsonNode.class);