2012-07-24 18 views
15

नीचे कोड के रूप में:क्या JSON का उपयोग करते समय हम मानचित्र में कुंजी के रूप में वस्तु बना सकते हैं?

public class Main { 

    public class innerPerson{ 
     private String name; 
     public String getName(){ 
      return name; 
     } 
    } 


    public static void main(String[] args){ 
     ObjectMapper om = new ObjectMapper(); 

     Map<innerPerson, String> map = new HashMap<innerPerson,String>(); 

     innerPerson one = new Main().new innerPerson(); 
     one.name = "david"; 

     innerPerson two = new Main().new innerPerson(); 
     two.name = "saa"; 

     innerPerson three = new Main().new innerPerson(); 
     three.name = "yyy"; 

     map.put(one, "david"); 
     map.put(two, "11"); 
     map.put(three, "true"); 



     try { 
      String ans = om.writeValueAsString(map); 

      System.out.println(ans); 


     } catch (JsonGenerationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JsonMappingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

} 

उत्पादन होता है:

{"[email protected]":"david","[email protected]":"true","[email protected]":"11"} 

यह नक्शा के प्रमुख सटीक डेटा हो बनाने के लिए संभव है, लेकिन नहीं वस्तु के केवल पता? कैसे?

+0

मुझे कुछ दिनों पहले एक ही समस्या थी और पाया कि कुंजी जैकसन के लिए नक्शे को सफलतापूर्वक क्रमबद्ध/deserialize करने के लिए एक pojo नहीं हो सकता है। –

+0

@ShankhoneerChakrovarty हाँ, यह सावधान रहना चाहिए जब मैं एक जटिल वस्तु को क्रमबद्ध करना चाहता हूं क्योंकि संभवतः इसमें वस्तुओं के साथ नक्शा संरचना शामिल है! क्या परेशानी है! – GMsoF

उत्तर

23

क्या हम जेएसओएन का उपयोग करते समय मानचित्र में कुंजी के रूप में वस्तु बना सकते हैं?

कड़ाई से, नहीं। JSON मानचित्र डेटा संरचना एक JSON ऑब्जेक्ट डेटा संरचना है, जो नाम/मान जोड़े का संग्रह है, जहां तत्व नाम स्ट्रिंग होना चाहिए। इस प्रकार, हालांकि, JSON ऑब्जेक्ट को मानचित्र के रूप में समझना और बाध्य करना उचित है, फिर भी JSON नक्शा कुंजियां स्ट्रिंग भी होनी चाहिए, क्योंकि एक JSON नक्शा एक JSON ऑब्जेक्ट है। JSON ऑब्जेक्ट (मानचित्र) संरचना का विनिर्देश http://www.json.org पर उपलब्ध है।

क्या नक्शा की कुंजी सटीक डेटा बनाना संभव है लेकिन ऑब्जेक्ट का पता केवल नहीं? कैसे?

Costi सही ढंग से जैक्सन के डिफ़ॉल्ट नक्शा कुंजी serializer, जो सिर्फ जावा मानचित्र कुंजी का toString() प्रणाली को बुलाती के व्यवहार का वर्णन किया। नक्शा कुंजी के JSON- अनुकूल प्रतिनिधित्व को वापस करने के लिए toString() विधि को संशोधित करने के बजाय, यह जैक्सन के साथ कस्टम मैप कुंजी क्रमबद्धता को लागू करने के लिए भी संभव और उचित रूप से सरल है। ऐसा करने का एक उदाहरण Serializing Map<Date, String> with Jackson पर उपलब्ध है।

1

मुद्रित "पता" जिसे आप देखते हैं वह केवल toString() विधि रिटर्न है।

काम करने के लिए अपने कोड के लिए आदेश में अब के लिए JSON marshaling की अनदेखी, आप लागू करने की आवश्यकता: equals(), hashCode() और toString() अपने InnerPerson वर्ग के भीतर। यदि आप नाम संपत्ति को toString() में वापस कर देते हैं, तो यह आपके JSON प्रतिनिधित्व में कुंजी बन जाएगा।

लेकिन equals() और hashCode() के लिए उचित कार्यान्वयन के बिना, आप हैश मैप का उचित उपयोग नहीं कर सकते हैं।

1

मौजूदा सही उत्तरों के अतिरिक्त, आप मॉड्यूल इंटरफ़ेस (आमतौर पर SimpleModule के साथ) का उपयोग कर कस्टम कुंजी धारावाहिक और कुंजी deserializers भी जोड़ सकते हैं। यह आपको धाराओं के क्रमिकरण और deserialization को बाहरी रूप से परिभाषित करने की अनुमति देता है। किसी भी तरह से, JSON में कुंजी स्ट्रिंग्स होनी चाहिए, जैसे कि दूसरों ने इंगित किया है।