How to modify JsonNode in Java?

后端 未结 6 743
生来不讨喜
生来不讨喜 2020-11-28 22:29

I need to change a JSON attribute\'s value in Java, I can get the value properly but I couldn\'t modify the JSON.

here is the code below

  JsonNode          


        
相关标签:
6条回答
  • 2020-11-28 22:40

    I think you can just cast to ObjectNode and use put method. Like this

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

    0 讨论(0)
  • 2020-11-28 22:41

    Adding an answer as some others have upvoted in the comments of the accepted answer they are getting this exception when attempting to cast to ObjectNode (myself included):

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

    The solution is to get the 'parent' node, and perform a put, effectively replacing the entire node, regardless of original node type.

    If you need to "modify" the node using the existing value of the node:

    1. get the value/array of the JsonNode
    2. Perform your modification on that value/array
    3. Proceed to call put on the parent.

    Code, where the goal is to modify subfield, which is the child node of NodeA and Node1:

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

    Credits:

    I got this inspiration from here, thanks to wassgreen@

    0 讨论(0)
  • 2020-11-28 22:42

    You need to get ObjectNode type object in order to set values. Take a look at this

    0 讨论(0)
  • 2020-11-28 22:51

    JsonNode is immutable and is intended for parse operation. However, it can be cast into ObjectNode (and ArrayNode) that allow mutations:

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

    For an array, you can use:

    ((ObjectNode)jsonNode).putArray("arrayName").add(object.ge‌​tValue());
    
    0 讨论(0)
  • 2020-11-28 23:02

    The @Sharon-Ben-Asher answer is ok.

    But in my case, for an array i have to use:

    ((ArrayNode) jsonNode).add("value");
    
    0 讨论(0)
  • 2020-11-28 23:03

    Just for the sake of understanding of others who may not get the whole picture clear following code works for me to find a field and then update it

    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");
        }
    }
    
    0 讨论(0)
提交回复
热议问题