Search code examples
javajsonjacksontextnode

How can I replace a Java Jackson TextNode by another one (update)?


My goal is to update some textual fields in a JsonNode.

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

I don't see how this could be done. Do you have any suggestion?


Solution

  • The short answer is: you can't. TextNode does not expose any operations that allows you to alter the contents.

    With that being said, you can easily traverse the nodes in a loop or via recursion to get the desired behaviour. Imagine the following:

    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);
        }
    }
    

    The output is:

    {"fieldName":"new value","nested":{"fieldName":"new value"}}