2016-06-23 6 views
10

में विशिष्ट नोड से ऑब्जेक्ट को मैप करने के लिए जैक्सन का उपयोग करना क्या जैक्सन के ObjectMapper एक JSON पेड़ में केवल एक विशिष्ट नोड (और 'डाउन') से unmarshall संभव है?JSON पेड़

उपयोग केस एक एक्स्टेंसिबल दस्तावेज़ प्रारूप है। मैं पेड़ पर चलना चाहता हूं, और उसके बाद वर्तमान पथ को प्लगइन के एक विस्तारित सेट पर प्रकाशित करना चाहता हूं, यह देखने के लिए कि उपयोगकर्ता उपयोग कर रहा है और प्लगइन्स जो जानता है कि दस्तावेज़ के उस हिस्से के साथ क्या करना है।

मैं प्लगइन लेखकों के लिए JsonNode या स्ट्रीमिंग एपीआई के निम्न-स्तर के विवरण से निपटने के लिए नहीं चाहता हूं; इसके बजाय, बस कुछ संदर्भ और एक विशिष्ट JsonNode पारित किया जाए, और उसके बाद पेड़ की जड़ के रूप में पारित नोड पर विचार करते हुए, सुंदर और सुविधाजनक ObjectMapper का उपयोग अपने वर्ग के उदाहरण को अनमशेल करने में सक्षम हो।

+1

बिल्कुल इस तरह लगता है: http://martinfowler.com/articles/refactoring-document-load.html#CreatingObjectsDeepInTheDocumentStructure –

उत्तर

13

निम्नलिखित JSON पर विचार करें:

{ 
    "firstName": "John", 
    "lastName": "Doe", 
    "address": { 
    "street": "21 2nd Street", 
    "city": "New York", 
    "postalCode": "10021-3100", 
    "coordinates": { 
     "latitude": 40.7250387, 
     "longitude": -73.9932568 
    } 
    } 
} 

और पर विचार आप निम्नलिखित जावा वर्ग में coordinates नोड पार्स करने के लिए करना चाहते हैं:

public class Coordinates { 

    private Double latitude; 

    private Double longitude; 

    // Default constructor, getters and setters omitted 
} 

यह करने के लिए, एक में पूरे JSON पार्स JsonNodeObjectMapper:

String json = "{\"firstName\":\"John\",\"lastName\":\"Doe\",\"address\":{\"street\":" 
      + "\"21 2nd Street\",\"city\":\"New York\",\"postalCode\":\"10021-3100\"," 
      + "\"coordinates\":{\"latitude\":40.7250387,\"longitude\":-73.9932568}}}"; 

ObjectMapper mapper = new ObjectMapper(); 
JsonNode node = mapper.readTree(json); 

फिर coordinates नोड क्वेरी करने के लिए JSON Pointer का उपयोग करें और ObjectMapper का उपयोग Coordinates वर्ग में यह पार्स करने के लिए:

JsonNode coordinatesNode = node.at("/address/coordinates"); 
Coordinates coordinates = mapper.treeToValue(coordinatesNode, Coordinates.class); 

JSON सूचक JSON पार करने के लिए एक रास्ता भाषा है। अधिक जानकारी के लिए, RFC 6901 देखें। यह संस्करण 2.3 के बाद जैक्सन में उपलब्ध है।

+1

यह वही है जो मैं बाद में था! एक बार मुझे इसे लागू करने का मौका मिलने के बाद मैं बक्षीस दूंगा। –

+0

मैं कहूंगा कि इस मामले के लिए 'node.get ("पता")' सरल/अधिक प्रभावशाली है। – shmosel

+1

@shmosel बेशक यह है। लेकिन यहां बिंदु JSON पथ है जिसे नोड के लिए क्वेरी करने के लिए उपयोग किया जा सकता है। उदाहरण के रूप में प्रदान किया गया JSON वास्तव में सरल है और हम JSON पथ का उपयोग करने के फायदे नहीं देख सकते हैं। –

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