2016-06-21 14 views
7

के साथ JSON प्रतिक्रिया के भीतर नेस्टेड ऑब्जेक्ट्स से deserializing फ़ील्ड ऐसा लगता है कि यह एक काफी हल/अच्छी तरह से संबोधित मुद्दा होना चाहिए, लेकिन मुझे इस पर अधिक मार्गदर्शन नहीं मिल रहा है - उम्मीद है कि यह एक डुप्ली नहीं है।जैक्सन

{ 
    "objects": [...], 
    "meta": { 
    "total": 5000, 
    "page": 1, 
    "result_pages": 20, 
    "links": { 
     "prev": null, 
     "next": "/api/v3/objects/somequery?page=2" 
    } 
    } 
} 

जाहिर है इस सरल है, लेकिन उम्मीद है कि यह भर में बिंदु हो जाता है:

मेरे परिदृश्य है कि मैं पृष्ठवार JSON जवाब है कि कुछ इस तरह दिखाई लेने वाली हूँ मूल रूप से है।

सभी मैं वास्तव में के बारे में परवाह objects और next क्षेत्रों रहे हैं, लेकिन जैसे मैं DTOs की एक पूरी पदानुक्रम बनाने के लिए सफलतापूर्वक एकत्रित फ़ील्ड deserialize करना होगा यह देख रहा है।

क्या कोई जैक्सन एनोटेशन है जो मुझे यह सब छोड़ने देगा? यदि नहीं, तो ऐसा करने के लिए सर्वोत्तम प्रथाओं का एक सेट है जिसमें अधिकांश खाली-खाली कक्षाएं और फ़ाइलें शामिल नहीं हैं?

उत्तर

8

क्या कोई जैक्सन एनोटेशन है जो मुझे यह सब छोड़ने देगा?

आप JsonDeserialize का उपयोग कर सकते हैं और कस्टम जेसनडेसरियलाइज़र को परिभाषित कर सकते हैं।

class MetaDeserializer extends JsonDeserializer<String> { 
    @Override 
    public String deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { 
     JsonNode tree = jp.readValueAsTree(); 
     return tree.get("links").get("next").asText(); 
    } 
} 

यहां मैंने सरल मानचित्र deserialization का उपयोग किया, लेकिन यदि आप चाहते हैं कि आप अपने स्वयं के तेजी से deserialization लागू कर सकते हैं।

और वस्तु

class MetaObject { 
    public List<Integer> objects; 

    @JsonDeserialize(using = MetaDeserializer.class) 
    public String meta; 

    @Override 
    public String toString() { 
     return "MetaObject{" + "objects=" + objects + ", meta='" + meta + '\'' + '}'; 
    } 
} 

और अगर आप MetaObject result = mapper.readValue("...", MetaObject.class) आह्वान तुम क्या आप

MetaObject{objects=[1, 2, 3], meta='/api/v3/objects/somequery?page=2'} 
+1

यह शायद आसान नहीं होगा सिर्फ एक पर एक टिप्पणी के साथ कि ऊपर उल्लेख किया 'JsonDeserializer' उपयोग करना चाहते हैं मिल जाएगा 'स्ट्रिंग अगली' संपत्ति और बस उसी फ्लैट स्तर पर 'ऑब्जेक्ट्स' 'के रूप में, इसके फ्लैट का नाटक करें? –

+0

@ap, आप कक्षा के शीर्ष पर भी इस एनोटेशन का अलग-अलग उपयोग कर सकते हैं, यहां प्रलेखन, https://fasterxml.github.io/jackson-databind/javadoc/2.3.0/com/fasterxml/jackson/databind /annotation/JsonDeserialize.html – SerCe

+1

किसी भी भावी खोजकर्ताओं के लिए, मुझे यह उल्लेख करना चाहिए कि उपर्युक्त उत्तर '.asText()' विधि का उपयोग करता है, जो गलत लगता है। मैं कुछ काम करने के बाद '.textValue()' का उपयोग कर समाप्त हुआ और यह एक आकर्षण की तरह काम कर रहा है। –