2013-08-04 10 views
13

मैं इसजैक्सन का उपयोग कर जावा में जावा मानचित्र को अनचाहे और क्रमबद्ध करने के लिए कैसे?

class Foo { 
    private Map<String, Data> dataMap; 
    private String fooFieldOne; 
    private String fooFieldTwo; 
} 

class Data { 
    private fieldOne; 
    private fieldTwo; 
} 

मैं इस

{ 
    "key1": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key2": { 
     "fieldOne": "some other value", 
     "fieldTwo": "some other value" 
    }, 
    "fooFieldOne":"valueone", 
    "fooFieldTwo":"valuetwo" 
} 

की तरह के रूप में JSON के रूप में क्रमानुसार करने चाहते हैं की तरह एक सेम है लेकिन मैं

{ 
    "dataMap": { 
     "key1": { 
      "fieldOne": "some value", 
      "fieldTwo": "some value" 
     }, 
     "key2": { 
      "fieldOne": "some other value", 
      "fieldTwo": "some other value" 
     } 
    }, 
    "fooFieldOne":"valueone", 
    "fooFieldTwo":"valuetwo" 
} 

कैसे में dataMap परत की अनदेखी करने की तरह परिणाम हो रही है उपरोक्त जेसन? मैं इसके लिए जावा जैक्सन लाइब्रेरी का उपयोग कर रहा हूं।

कोड मैं करने की कोशिश की है

ObjectMapper mapper = new ObjectMapper(); 
mapper.writeValueAsString(myFOOObject) 

उत्तर

10

आप dataMap के लिए एक गेटर बना सकते हैं और पूरे Foo उदाहरण के dataMap को क्रमानुसार बजाय सकता है।

mapper.writeValueAsString(myFOOObject.getDataMap()); 

एक अन्य विधि @JsonUnwrapped एनोटेशन उपयोग कर रहा है। यह एनोटेशन जैक्सन 1.9+ में उपलब्ध है।नक्शे के लिए गेटर साथ @JsonAnyGetter एनोटेशन का उपयोग कर -

http://jackson.codehaus.org/1.9.9/javadoc/org/codehaus/jackson/annotate/JsonUnwrapped.html

यह व्याख्या का उपयोग करने का नकारात्मक पक्ष यह है के रूप में answer to your other question

+0

हाय बार्ट, आपके विस्तृत उत्तर के लिए धन्यवाद। लेकिन मेरे पास मेरे बीन में अन्य क्षेत्र भी हैं। फू पर विचार करें कि मेरे पास पहले से मौजूद मानचित्र के साथ अन्य फ़ील्ड fooFieldOne, fooFieldTwo है। मैं सब कुछ एक वस्तु के रूप में क्रमबद्ध करना चाहता हूं जैसे {"key1": {"fieldOne": "कुछ मान", "fieldTwo": "कुछ मान"}, "key2": {"fieldOne": "कुछ अन्य मान", " फ़ील्ड दो ":" कुछ अन्य मूल्य "}," fooFieldOne ":" वैलोन "," fooFieldTwo ":" valueetwo "}। इससे मैं किस तरह निपट सकता हूं? – suren

+0

ने @JsonUnwrapped एनोटेशन को शामिल करने के लिए अपना उत्तर अपडेट किया। – Bart

2

आप

{ "dataMap": ... } 

क्योंकि Foo एक क्षेत्र यह भीतर dataMap कहा जाता है हो रही है। यहाँ क्षेत्र के नाम नजरअंदाज नहीं किया जा सकता है क्योंकि यह Foo यदि एक से अधिक नक्शे था, जैसे

class Foo { 
private Map<String, Data> dataMap1; 
private Map<String, Data> dataMap2; 
} 

कुछ विरोध करता है अब FIELDNAME बिना पैदा करेगा: JSON में, JSON यह नहीं पता कि करने के लिए deserialize जब यह की तरह

{ 
    //belongs to dataMap1 
    "key1": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key2": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    //belongs to dataMap2 
    "key3": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key4": { 
     "fieldOne": "some other value", 
     "fieldTwo": "some other value" 
    } 
} 

कुछ JSON हो जाता है अब होने FIELDNAME यह बहुत स्पष्ट जबकि

012 deserializing बनाता है
{ 
    "dataMap1" : { 
    "key1": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key2": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    } 
    }, 
    "dataMap2" : { 
    "key3": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key4": { 
     "fieldOne": "some other value", 
     "fieldTwo": "some other value" 
    } 
    } 
} 

कहा करने के बाद कि

कैसे json में dataMap परत की अनदेखी करने के?

तुम बस नक्शा

ObjectMapper mapper = new ObjectMapper(); 
mapper.writeValueAsString(myFOOObject.getDataMap()); 
+0

आपके विस्तृत उत्तर के लिए धन्यवाद। मैं समझ सकता हूं कि मेरे मामले में क्या हो रहा है। लेकिन मेरे पास मेरे बीन में अन्य क्षेत्र हैं। फू को मेरे पास मानचित्र के साथ अन्य फ़ील्ड fooFieldOne, fooFieldTwo होने पर विचार करें। { "fieldOne": "कुछ मूल्य", "fieldTwo": "कुछ मूल्य" }, "कुंजी 2": { "fieldOne": मैं { "कुंजी 1" की तरह एक वस्तु के रूप में सब कुछ को क्रमानुसार करने चाहते हैं " कुछ अन्य मूल्य ", " फ़ील्ड दो ":" कुछ अन्य मूल्य " }," fooFieldOne ":" valueone "," fooFieldTwo ":" valueetwo " }। इससे मैं किस तरह निपट सकता हूं? – suren

+0

मुझे लगता है कि यह संभव नहीं है क्योंकि नक्शा क्षेत्र में हमेशा कुछ नाम होगा (हमारे पास अज्ञात फ़ील्ड नहीं हो सकता है) और यह निश्चित रूप से JSON – sanbhat

+0

@sanbhat में कब्जा कर लिया जाएगा यह '@ JsonUnwrapped' का उपयोग करना संभव है। – Bart

0

को क्रमानुसार कर सकते हैं नक्शे में दो वस्तुओं String और Data है। JSON जावा ऑब्जेक्ट को JSON कुंजी मान जोड़ी में परिवर्तित करता है, लेकिन यदि आपके पास पहले से कोई नक्शा है जिसमें कुंजी मान जोड़ी है, और उस मानचित्र को JSON दस्तावेज़ में रूपांतरित करें, तो मानचित्र कुंजी JSON कुंजी मान जोड़ी में भी परिवर्तित हो जाती है और मानचित्र मान में ऑब्जेक्ट भी होता है जो कुंजी मूल्य जोड़ी में परिवर्तित हो जाता है।

0

मैं इस सवाल का जवाब मिल गया में कहा गया मानचित्र का उपयोग करने की अक्षमता है। Deserialization के दौरान संघर्ष से बचने के लिए इस मानचित्र के लिए सेटर के साथ @JsonAnySetter एनोटेशन का उपयोग किया जाना चाहिए।

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

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