जावा में JsonNode को कैसे संशोधित करें?


109

मुझे जावा में 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
            }
        }
    }

इसे करने का बेहतरीन तरीका क्या है?


1
आप JsonNode को Java Map में resultMap = mapper.convertValue(aJsonNode, Map.class);बदल सकते हैं , उदाहरण के लिए इसे मैप में संशोधित करें और फिर उस मैप को JsonNode में बदल दें। बस केह रहा हू।
माइक जेरामसी 56

जवाबों:


195

JsonNodeअपरिवर्तनीय है और पार्स ऑपरेशन के लिए अभिप्रेत है। हालाँकि, इसे म्यूटेशन में डाला जा सकता है ObjectNode(और ArrayNode):

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

एक सरणी के लिए, आप उपयोग कर सकते हैं:

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

4
एक संख्यात्मक प्रकार के लिए कोशिश की जाती है जिसमें मुझे मूल्य बदलने की आवश्यकता होती है। मुझे यह अपवाद मिला:Exception in thread "main" java.lang.ClassCastException: com.fasterxml.jackson.databind.node.IntNode cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode
बाल्बोआ_21

आपको "IntNode"
mulya

6

कुछ अन्य के रूप में एक उत्तर जोड़ना, स्वीकार किए गए उत्तर की टिप्पणियों में उत्थान किया गया है जब वे 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, जो बच्चे का नोड है NodeAऔर 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");

क्रेडिट:

मुझे यहाँ से यह प्रेरणा मिली , wassgreen @ का धन्यवाद


5

@ शेरोन-बेन-अशर जवाब ठीक है।

लेकिन मेरे मामले में, एक सरणी के लिए मुझे उपयोग करना होगा:

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

4

मुझे लगता है कि आप बस ObjectNode और उपयोग putविधि के लिए कास्ट कर सकते हैं । ऐशे ही

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


2

ObjectNodeमान सेट करने के लिए आपको टाइप ऑब्जेक्ट प्राप्त करने की आवश्यकता है । इस पर एक नजर


0

सिर्फ दूसरों की समझ के लिए जो पूरी तस्वीर स्पष्ट नहीं कर सकते हैं निम्नलिखित क्षेत्र मेरे लिए एक क्षेत्र खोजने के लिए काम करता है और फिर इसे अपडेट करें

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");
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.