如何用另一个Java Jackson TextNode替换Java Jackson TextNode(更新)



我的目标是更新JsonNode中的一些文本字段。

    List<JsonNode> list = json.findValues("fieldName");
    for(JsonNode n : list){
        // n is a TextNode. I'd like to change its value.
    }

我不知道怎么会这样。你有什么建议吗?

简单的答案是:你不能。TextNode不公开任何允许您更改内容的操作。

话虽如此,您可以轻松地遍历循环中的节点,或者通过递归来获得所需的行为。想象一下:

public class JsonTest {
    public static void change(JsonNode parent, String fieldName, String newValue) {
        if (parent.has(fieldName)) {
            ((ObjectNode) parent).put(fieldName, newValue);
        }
        // Now, recursively invoke this method on all properties
        for (JsonNode child : parent) {
            change(child, fieldName, newValue);
        }
    }
    @Test
    public static void main(String[] args) throws IOException {
        String json = "{ "fieldName": "Some value", "nested" : { "fieldName" : "Some other value" } }";
        ObjectMapper mapper = new ObjectMapper();
        final JsonNode tree = mapper.readTree(json);
        change(tree, "fieldName", "new value");
        System.out.println(tree);
    }
}

输出为:

{"fieldName":"new value","nested":{"field Name":《new value》}}

因为无法修改TextNode,所以可以获取该字段的所有parentNodes,并使用相同的字段名和新值对其调用put操作。它将替换现有字段并更改值。

List<JsonNode> parentNodes = jsonNode.findParents("fieldName");
if(parentNodes != null) {
  for(JsonNode parentNode : parentNodes){
    ((ObjectNode)parentNode).put("fieldName", "newValue");
  }
}

最新更新