2011-03-30 29 views
6

का उपयोग कर निम्नलिखित json deserialize कैसे मैं निम्नलिखित json है:जैक्सन

{ 
    "id":"myid", 
    "fields":{ 
    "body":"text body" 
    } 
} 

जो मैं निम्नलिखित जावा वर्ग में deserialize हैं:

class TestItem { 
private String id; 
private String body; 

public String getId() { 
    return id; 
} 

public void setId(String id) { 
    this.id = id; 
} 

public String getBody() { 
    return body; 
} 

public void setBody(String body) { 
    this.body = body; 
} 

जैक्सन Json deserializer का उपयोग कर। यह काम नहीं करता है क्योंकि body फ़ील्ड fields आंतरिक कक्षा के अंदर घोंसला है।

मैं json संरचना को बदल नहीं सकते, इसलिए वहाँ किसी भी तरह से (शायद एनोटेशन का उपयोग) मैं TestItem.fields.body से TestItem.body करने के लिए body क्षेत्र की पुन: मैप कर सकते हैं?

संपादित करें: मैं इस एक बड़ा वर्ग पदानुक्रम और अभ्यास का उद्देश्य का हिस्सा है कहा जाना चाहिए था इसके बारे में गहराई को कम करना है। दूसरे शब्दों में, मुझे पता है कि मैं एक आंतरिक वर्ग घोषित कर सकता हूं और फिर उस तक पहुंच सकता हूं, लेकिन यह वह नहीं है जिसे मैं प्राप्त करने की कोशिश कर रहा हूं।

+0

स्ट्रीमिंग API का उपयोग करके इसे कैसे पढ़ा जाए? – emaillenin

उत्तर

5

कुछ फीचर अनुरोध हैं कि (यदि कार्यान्वित किया गया है) सीमित एक-स्तर रैपिंग/अनैपिंग की अनुमति देगा। लेकिन वर्तमान में ऐसा करने के लिए कोई घोषणात्मक तरीका नहीं है। और कुछ डिग्री के लिए यह एज केस है, क्योंकि यह डेटा बाध्यकारी के विपरीत डेटा रूपांतरण में जाता है (दुर्भाग्यवश मैं अच्छी वस्तु परिवर्तन libs के बारे में नहीं सोच सकता, इसलिए वहां कुछ अंतर हो सकता है)।

आमतौर पर क्या किया जाता है, तो दो चरण बाध्यकारी करना होता है: पहले इंटरमीडिएट प्रकारों (अक्सर java.util.Map, या जैक्सन जेसन नोड (वृक्ष मॉडल) में; उनको संशोधित करें, और फिर इस प्रकार से वास्तविक परिणाम में कनवर्ट करें। उदाहरण के लिए इस तरह कुछ:

JsonNode root = mapper.readTree(jsonSource); 
// modify it appropriately (add, remove, move nodes) 
MyBean bean = mapper.convertValue(root, MyBean.class);