Java动态修改未知JSON的JsonNode

InC*_*nCh 4 jsonpath jackson

我正在尝试修改一个 JSON(结构未知),其中 JsonPath 及其等效的 XML Xpath 是我已知的。

我已经厌倦了使用com.jayway.jsonpath.JsonPath图书馆。JsonPath 的问题是,它返回值但我无法修改目标节点。

以下是我的代码片段

JsonPath.read(jsonFile, jsonPath);
JsonPath.parse(jsonPath);
System.out.println("Author: "+JsonPath.read(jsonFile, jsonPath));
Run Code Online (Sandbox Code Playgroud)

我尝试使用之前问过的问题中提到的杰克逊,但它需要按如下方式逐个节点遍历

((ObjectNode) parent).put(fieldName, newValue);
Run Code Online (Sandbox Code Playgroud)

由于未知的结构,我无法做到这一点。

我已经尝试了递归解析 JSON 对象问题的答案,但它说明了如何解析而不是修改

我需要做以下事情

JsonNode root = mapper.readTree("Json in form of String");
((JsonNode)(root.get("JsonPath")).set("New Value");
Run Code Online (Sandbox Code Playgroud)

有什么方法可以实现吗?

Man*_*dis 5

JsonNode对象是不可变的,所以你不能修改它们。你可以做的是JsonNode用另一个替换一个。到铸件ObjectNode还需要揭露所需的方法。首先找到要替换的节点的父节点:

JsonNode node = root.findParent("JsonPath");
Run Code Online (Sandbox Code Playgroud)

然后使用这两种方法之一将其替换为新的:

((ObjectNode) node).remove("JsonPath");           // remove current node
((ObjectNode) node).put("JsonPath", "New Value"); // add new one with new value
Run Code Online (Sandbox Code Playgroud)

或者

((ObjectNode) node).replace("JsonPath", new TextNode("New Value"));
Run Code Online (Sandbox Code Playgroud)