জাভাতে জসননোডকে কীভাবে পরিবর্তন করবেন?


109

আমার জাভাতে একটি জেএসএন অ্যাট্রিবিউটের মান পরিবর্তন করতে হবে, আমি মানটি সঠিকভাবে পেতে পারি তবে আমি জেএসএন সংশোধন করতে পারিনি।

নীচের কোডটি এখানে

  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
আপনি জসননোডকে একটি জাভা মানচিত্রে রূপান্তর করতে পারেন, উদাহরণস্বরূপ মানচিত্রে resultMap = mapper.convertValue(aJsonNode, Map.class);এটি সংশোধন করুন এবং তারপরে সেই মানচিত্রটিকে জসননোডে ফিরে যেতে পারেন। কথা মাত্র.
মাইকজেআরমসি 56

উত্তর:


195

JsonNodeঅপরিবর্তনীয় এবং পার্স অপারেশনের উদ্দেশ্যে for তবে, এটি 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
balboa_21

আপনার "ইন্টনোড" চেষ্টা করতে হবে
মুল্য

6

কিছু অন্যান্য গ্রহণযোগ্য উত্তরের মন্তব্যে যেমন উত্তর যুক্ত করা হয়েছে তখন অবজেক্টনোডে কাস্ট করার চেষ্টা করার সময় তারা এই ব্যতিক্রম পাবে (আমার অন্তর্ভুক্ত):

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

আমি মনে করি আপনি কেবল অবজেক্টনোডে কাস্ট করতে পারেন এবং putপদ্ধতিটি ব্যবহার করতে পারেন । এটার মত

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



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");
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.