JsonNode को POJO में बदलें


143

यह थोड़ा असामान्य लग सकता है, लेकिन मैं JsonNodeइसे ए / ए में बदलने / मैप करने के लिए एक कुशल तरीके की तलाश कर रहा हूं POJO

मैं अपने कुछ मॉडल की जानकारी को json फ़ाइलों में संग्रहीत करता हूं और मुझे अपने मॉडल के एक-दो संस्करण का समर्थन करना होगा।

मैं जोसन फाइल को एक JsonNode में मेमोरी में लोड करता हूं, इसे अपने मॉडल के नवीनतम संस्करण से मिलान करने के लिए कुछ संस्करण रणनीतियों को लागू करें।

    ObjectMapper mapper = new ObjectMapper();
    BufferedReader fileReader = new BufferedReader(new FileReader(projPath));

    JsonNode rootNode = mapper.readTree(fileReader);

    //Upgrade our file in memory
    applyVersioningStrategy(rootNode);

    ProjectModel project = mapJsonNodeToProject(rootNode);

जब तक ऐसा करने का एक तेज़ तरीका नहीं है, मैं शायद JsonNodesअपने मॉडल पर मैन्युअल रूप से लागू करने के लिए समाप्त हो जाऊंगा

जवाबों:


264

जैक्सन 2.4 में, आप निम्नानुसार परिवर्तित कर सकते हैं:

MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);

जहां jsonObjectMapperएक जैक्सन है ObjectMapper


जैक्सन के पुराने संस्करणों में, यह होगा

MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);

19
Unfortunatelly का कोई वृक्ष नहीं है ToValue (TreeNode n, TypeReference <T> प्रकार) वैरिएंट है जैसे कि readValue ()। जेनरिक के साथ अधिक जटिल प्रकारों से निपटने वाले किसी के लिए बुरी खबर :(
एस्पिनोसा

13
@ ईस्पिनोसा प्रति जैकसन - डेटाबाइंड # 1294 , आप कुछ ऐसा चाहेंगे (दुर्भाग्य से अधिक क्रिया)jsonObjectMapper.readValue(jsonObjectMapper.treeAsTokens(someJsonNode), someTypeReference)
एम। जस्टिन

पुराने संस्करण के उपयोग के लिए:objectMapper.treeToValue(jsonNode, MyClass.class)
amod

2
आप इस विधि का उपयोग StdDeserializer में भी कर सकते हैं p.codec.treeToValue:।
गलसीयूरियो

@icedtrees jsonObjectMapper JsonObjectMapper या सिर्फ ObjectMapper का एक उदाहरण है
KNDheeraj

8

यह काम कर जाना चाहिए:

mapper.readValue(fileReader, MyClass.class);

मुझे कहना चाहिए क्योंकि मैं एक के साथ प्रयोग कर रहा हूँ String, BufferedReaderलेकिन यह अभी भी काम करना चाहिए।

यहाँ मेरा कोड है:

String inputString = // I grab my string here
MySessionClass sessionObject;
try {
    ObjectMapper objectMapper = new ObjectMapper();
    sessionObject = objectMapper.readValue(inputString, MySessionClass.class);

यहाँ उस कॉल के लिए आधिकारिक दस्तावेज हैं: http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(java.lang.Sring, java.lang.Class)

जब आप त्वरित रूप से कस्टम deserializer को परिभाषित कर सकते हैं ObjectMapper: http://wiki.fasterxml.com/JacksonHowToCustomDeserializers

संपादित करें: मुझे अभी कुछ और याद आया। यदि आपके पास आने वाली वस्तु में से अधिक गुण हैं POJOऔर आप बस उस अतिरिक्त को अनदेखा करना चाहते हैं जिसे आप इसे सेट करना चाहते हैं:

    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

या आपको एक त्रुटि मिलेगी कि यह संपत्ति को सेट करने के लिए नहीं मिल सकती है।


मैं एक CustomDeserializers का उपयोग करूँगा, यह मुझे बहुत सिरदर्द से बचाने वाला है! मैं भी बहुत कम संशोधनों के साथ अपनी संस्करण रणनीतियों को लागू कर पाऊंगा। धन्यवाद!
अलेक्जेंड्रे

5
अब सिंटैक्स है: com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper (); mapper.disable (com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
llambda

अच्छा बिंदु @llambda! मैंने 1.7M संस्करण के बाद से ObjectMapper को नहीं छुआ है, ऐसा लगता है कि मेरा उत्तर कुछ संस्करणों द्वारा पुराना है। निश्चित रूप से जांचें कि आप जैक्सन के किस संस्करण का उपयोग कर रहे हैं।
एरिक बर्र

@ EricBarr, मैं जैक्सन v1.9.11 का उपयोग कर रहा हूं और आपके उत्तर में वाक्य रचना उस संस्करण के लिए सही है। शायद उन्होंने चीजों को बदलने की कोशिश की और उन्हें नए संस्करणों में फिर से
उलट दिया

5

यदि आप org.codehaus.jackson का उपयोग कर रहे हैं, तो यह 1.6 से संभव हो गया है। आप एक JsonNode को POJO में बदल सकते हैं ObjectMapper#readValue: http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue/org.codehaus.jackson.JsonNode , java। lang.Class)


    ObjectMapper mapper = new ObjectMapper();
    JsonParser jsonParser = mapper.getJsonFactory().createJsonParser("{\"foo\":\"bar\"}");
    JsonNode tree = jsonParser.readValueAsTree();
    // Do stuff to the tree
    mapper.readValue(tree, Foo.class);

5
यह विधियाँ 2.4.4 में गायब लगती हैं
केविन विटटेक

1
एक संस्करण 2 समाधान के लिए नीचे icedtrees का जवाब देखें
टिम ब्यूटे 14

दस्तावेज़ अब और अधिक तेज़
डेविड टोनहोफर

3
String jsonInput = "{ \"hi\": \"Assume this is the JSON\"} ";
com.fasterxml.jackson.databind.ObjectMapper mapper =
    new com.fasterxml.jackson.databind.ObjectMapper();
MyClass myObject = objectMapper.readValue(jsonInput, MyClass.class);

यदि आपके JSON इनपुट में आपके POJO से अधिक गुण हैं और आप केवल जैक्सन 2.4 में एक्स्ट्रा को अनदेखा करना चाहते हैं, तो आप अपने ObjectMapper को निम्नानुसार कॉन्फ़िगर कर सकते हैं। यह सिंटैक्स पुराने जैक्सन संस्करणों से अलग है। (यदि आप गलत सिंटैक्स का उपयोग करते हैं, तो यह चुपचाप कुछ भी नहीं करेगा।)

mapper.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNK‌​NOWN_PROPERTIES);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.