2012-07-16 18 views
12

के साथ जैक्सन ऑब्जेक्टमैपर मैं JSON फ़ाइलों को पार्स करने के लिए एंड्रॉइड प्रोजेक्ट में जैक्सन 1.9.5 का उपयोग कर रहा हूं।मनमाने ढंग से JSON कुंजी

अब तक मैं किसी भी समस्या नहीं है, और फ़ाइलों ठीक निम्नलिखित कोड का उपयोग कर पार्स कर सकते हैं:

AssetManager mgr = getAssets(); 
ObjectMapper mapper = new ObjectMapper(); 

try { 
    InputStream ifp = mgr.open("detail_schema.json"); 
    schema = mapper.readValue(ifp, DetailSchema.class); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

कहाँ DetailSchema वर्ग आदिम प्रकार और वर्गों का एक मिश्रण के होते हैं। अब मैं एक समस्या है जहाँ मैं निम्नलिखित की तरह कुछ JSON पार्स करने के लिए चाहता हूँ में चल रहा हूँ:

"fields": { 
    "Suburb": "Paddington", 
    "State": "NSW", 
    "Post Code": "2074", 
    "Lollipop": "Foo Bar Haz" 
} 

कहाँ मैं संभवतः नक्शा कुंजी पहले से पता नहीं कर सकते हैं (वे उपयोगकर्ता परिभाषित किया जा सकता है)। इस प्रकार, मुझे यकीन नहीं है कि संबंधित जावा क्लास कैसा दिखना चाहिए।

Ie, इस उदाहरण के लिए, यह दिखाई देगा:

public class MyClass { 

    public String Suburb; 
    public String State; 
    public String PostCode; 
    public String Lollipop; 

} 

लेकिन इस JSON फ़ाइल का एक और उदाहरण के लिए सही नहीं हो सकता। आदर्श रूप से मुझे जैक्सन को NameValuePair जैसे कुछ मानों को मैप करने के लिए कुछ तरीका चाहिए। मुझे संदेह है कि स्वचालित ऑब्जेक्ट मैपिंग इस मामले में एक विकल्प नहीं हो सकता है - क्या कोई इसे पुष्टि या अस्वीकार कर सकता है?

उत्तर

16

आपके पास दो विकल्प हैं। या तो आप readTree in ObjectMapper का उपयोग कर सकते हैं, जो JsonNode देता है। एक JsonNode साथ कार्य करना, बहुत एक पेड़ के साथ काम करने की तरह है, इसलिए आप, बच्चों नोड्स प्राप्त कर सकते हैं मूल्यों को पढ़ने, वगैरह:

InputStream ifp = mgr.open("detail_schema.json"); 
JsonNode root = mapper.readTree(ifp); 
JsonNode fields = root.get("fields"); 
for (JsonNode children : fields.getElements()) { 
    // ... 
} 

तो फिर आप अपने DetailSchema वस्तु मैन्युअल रूप से बनाने की जरूरत होगी।

या, आप जैक्सन एक मानचित्र, जिस स्थिति में आप अपने कोड का उपयोग करेंगे के रूप में यह deserialize करने दे सकते हैं, लेकिन जहां MyClass इस तरह होगा:

public class MyClass { 
    public Map<String, Object> fields; 

    // getter/setters 
} 

आप शायद String के रूप में के रूप में नक्शे मूल्यों टाइप कर सकते हैं ठीक है अगर आपको यकीन है कि इनपुट जेसन में टेक्स्ट हैं। (असल में, मुझे यकीन नहीं है कि किस प्रकार प्रवर्तन जैक्सन करता है, शायद यह किसी भी तरह की अनुमति देगा ...)

+1

ग्रेट धन्यवाद! एक मानचित्र मेरे उद्देश्यों के लिए ठीक काम करेगा। – aaronsnoswell

+0

आपको 'मैप' प्राप्त करने के लिए वास्तव में कस्टम क्लास का उपयोग करने की ज़रूरत नहीं है, आप जैक्सन को सीधे 'मानचित्र' इंटरफ़ेस के कार्यान्वयन के लिए deserialize कर सकते हैं, उदाहरण के लिए: 'मानचित्र jsonFields = mapper.readValue (ifp, हैश मैप .class) ' – brianmearns