2012-04-11 8 views
14

मैं सिर्फ जैक्सन JSON लाइब्रेरी का उपयोग शुरू कर रहा हूँ। जैक्सन एक बहुत ही शक्तिशाली पुस्तकालय है, लेकिन इसमें बहुत व्यापक एपीआई है। कई तरीकों से कई चीजें किए जा सकते हैं। इससे जैक्सन में अपना रास्ता खोजना मुश्किल हो जाता है - यह जानना कि चीजों को करने का सही/सर्वोत्तम तरीका क्या है? इस तरह एक समाधान से अधिकपढ़ा गया और जैक्सन में रीड ट्री: किस का उपयोग कब किया जाए?

String json = "{\"a\":2, \"b\":\"a string\", \"c\": [6.7, 6, 5.6, 8.0]}"; 
ObjectMapper mapper = new ObjectMapper(); 
JsonNode node = mapper.readValue(json, JsonNode.class); 
if (node.isObject()) { 
    ObjectNode obj = mapper.convertValue(node, ObjectNode.class); 
    if (obj.has("a")) { 
     System.out.println("a=" + obj.get("a").asDouble()); 
    } 
} 

:

क्यों मैं इस समाधान का प्रयोग करेंगे

String json = "{\"a\":2, \"b\":\"a string\", \"c\": [6.7, 6, 5.6, 8.0]}"; 
ObjectMapper mapper = new ObjectMapper(); 
JsonNode node = mapper.readTree(json); 
if (node.isObject()) { 
    ObjectNode obj = (ObjectNode) node; 
    if (obj.has("a")) { 
     System.out.println("a=" + obj.get("a").asDouble()); 
    } 
}  

या समाधान से अधिक है कि मैं JsonFactory और JsonParser और हो सकता है और भी विकल्प का उपयोग कर भर आया ...

ऐसा लगता है कि mapper.readValue सबसे सामान्य है और कई मामलों में इसका उपयोग किया जा सकता है: जेसननोड, ऑब्जेक्ट नोड, ऐरेनोड, पोजो इत्यादि को पढ़ें। तो मैं क्यों चाहूंगा ई mapper.readTree?

और सबसे अच्छा तरीका है एक ObjectNode करने के लिए एक JsonNode कन्वर्ट करने के लिए क्या है? बस ऑब्जेक्ट नोड में डाला? या mapper.convertValue जैसे कुछ का उपयोग करें?

उत्तर

12

readValue() का उपयोग JsonNode सहित किसी भी और सभी प्रकार के लिए किया जा सकता है। readTree() केवल JsonNode (पेड़ मॉडल) के लिए काम करता है; और सुविधा के लिए जोड़ा गया है।

ध्यान दें कि आप कभी भी अपना पहला उदाहरण उपयोग नहीं करना चाहते हैं: यह आपके नोड को JSON के रूप में लिखने के बराबर है, फिर इसे वापस पढ़ना - बस इसे कास्ट करें।

+0

धन्यवाद, यह उपयोगी जानकारी है। मुझे लगता है कि कनवर्ट करना संभव था जब सही हो तो सही प्रकार पर डाला जा सके और यह खुद को कास्टिंग करने से सुरक्षित होगा ... –

+1

यह एक दिलचस्प विचार है - शायद इस तरह के कोड को जोड़ा जा सकता है? नाम 'कन्वर्ट' रूपांतरण को व्यक्त करने के लिए है; बस नहीं डाला, लेकिन मुझे लगता है कि यह अनुचित उम्मीद नहीं है। मैं इसके लिए एक सुधार मुद्दा दर्ज करूंगा। – StaxMan

4

पढ़ें मूल्य अपने खुद के जावा वर्गों के लिए इस्तेमाल किया जा सकता:

public class Foo { 
    private int a; 
    private String b; 
    private double[] c; 

    // getters/setters 
} 

String json = "{\"a\":2, \"b\":\"a string\", \"c\": [6.7, 6, 5.6, 8.0]}"; 
ObjectMapper mapper = new ObjectMapper(); 
Foo foo = mapper.readValue(json, Foo.class); 

अर्थात readTree आप तब चुन सकते हैं जब आप ऑब्जेक्ट का सटीक प्रकार नहीं रखते हैं। जबकि readValue - जब आप निश्चित रूप से वस्तु प्रकार को जानते हैं।

+0

दरअसल, यह उन चीजों में से एक है जो पढ़ने के लिए अमेज़ॅन स्थितियों में उपयोग करने योग्य हैं, तो क्यों पढ़ा जाता है पढ़ने के बाद कभी भी पढ़ना चुनें? –

+0

readTree आप तब चुन सकते हैं जब आप ऑब्जेक्ट का सटीक प्रकार नहीं रखते हैं। जबकि readValue - जब आप निश्चित रूप से वस्तु प्रकार को जानते हैं। –

संबंधित मुद्दे