2013-02-03 14 views
5

मेरे पास एक नक्शा है जहां एक कुंजी का मूल्य वस्तुओं की एक सूची है। builder.enableComplexMapKeySerialization(); के माध्यम से चाबियों को क्रमबद्ध करने में सक्षम हूं लेकिन मानों को अपेक्षित के रूप में क्रमबद्ध नहीं किया गया है क्योंकि वे ऑब्जेक्ट के बजाय deserialization पर एक स्ट्रिंग वापस कर सकते हैं।जीसन सीरियलाइजिंग हैश मैप <शिक्षक, सूची <Student>>

नीचे क्रमबद्धता का आउटपुट है

[{ "id": 31001, "नाम": टीचर "]} आईडी", // यह कुंजी

[{है ": 33033 "नाम": "student1"}, { "id": 34001, "नाम": "student2"}]], // यह

मैं प्रासंगिक TypeToken जो TypeToken<HashMap<Teacher, List<Student>>> है इस्तेमाल किया मानों की सूची है लेकिन फिर भी सूची मान वस्तु के बजाए deserialization पर एक स्ट्रिंग वापस कर दिया गया है।

उत्तर

17

JSON नाम/मूल्य जोड़े से बना है (जहां मूल्य पक्ष चीजों की एक सूची हो सकता है)। इसका नाम एक स्ट्रिंग है (देखें: http://json.org)

आप जो करने का प्रयास कर रहे हैं वह किसी ऑब्जेक्ट को नाम के रूप में उपयोग करना है; आप सीधे ऐसा नहीं कर सकते हैं। एक JSON ऑब्जेक्ट नाम/मान जोड़ी के लिए नाम नहीं हो सकता है।

यदि आप documentation for enableComplexMapKeySerialization पढ़ते हैं तो यह बताता है कि परिणामी JSON क्या होगा।

JSON यह उत्पन्न करता है (एक JSON सरणी के रूप में एक मानचित्र) पूरी तरह से आपके मानचित्र पर deserialize होगा। निम्नलिखित एक पूर्ण, कामकाजी उदाहरण (जावा 7) है।

ध्यान दें कि एक बार जब मैं JSON से जावा पर deserialize करता हूं, तो मैं कुंजी प्राप्त करने के लिए मानचित्र पर पुनरावृत्ति कर रहा हूं। ऐसा इसलिए है क्योंकि equals() और hashCode()Teacher में ओवरराइड होने के बिना Teacher का नया उदाहरण बनाने का कोई तरीका नहीं है और यह एक कुंजी के रूप में कार्य करता है (केवल संदर्भ मानों की तुलना की जाती है)।

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.reflect.TypeToken; 
import java.lang.reflect.Type; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 


public class App 
{ 
    public static void main(String[] args) 
    { 
     HashMap<Teacher, List<Student>> map = new HashMap<>(); 
     Teacher t = new Teacher("12345", "Teacher"); 
     Teacher t2 = new Teacher("23456", "Teacher2"); 
     ArrayList<Student> list = new ArrayList<>(); 
     for (int i = 0; i < 3; i++) { 
      list.add(new Student(String.valueOf(i), "Student" + String.valueOf(i))); 
     } 

     map.put(t, list); 
     map.put(t2, list); 

     GsonBuilder builder = new GsonBuilder(); 

     Gson gson = 
      builder.enableComplexMapKeySerialization().setPrettyPrinting().create(); 
     Type type = new TypeToken<HashMap<Teacher,List<Student>>>(){}.getType(); 
     String json = gson.toJson(map, type); 
     System.out.println(json); 

     System.out.println("\nAfter deserialization:"); 
     HashMap<Teacher, List<Student>> map2 = gson.fromJson(json, type); 

     for (Teacher t3 : map2.keySet()) { 
      System.out.println(t3.name); 
      for (Student s2 : map2.get(t3)) { 
       System.out.println("\t" + s2.name); 
      } 
     } 
    } 
} 

class Teacher { 
    public String id; 
    public String name; 

    public Teacher(String id, String name) { 
     this.id = id; 
     this.name = name; 
    } 
} 

class Student { 
    public String id; 
    public String name; 

    public Student(String id, String name) { 
     this.id = id; 
     this.name = name; 
    } 

} 

आउटपुट:

class Teacher { 

    public String id; 
    public String name; 

    public Teacher(String id, String name) { 
     this.id = id; 
     this.name = name; 
    } 

    @Override 
    public int hashCode() 
    { 
     int hash = 3; 
     hash = 37 * hash + Objects.hashCode(this.id); 
     hash = 37 * hash + Objects.hashCode(this.name); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object obj) 
    { 
     if (obj == null) 
     { 
      return false; 
     } 
     if (getClass() != obj.getClass()) 
     { 
      return false; 
     } 
     final Teacher other = (Teacher) obj; 
     if (!Objects.equals(this.id, other.id)) 
     { 
      return false; 
     } 
     if (!Objects.equals(this.name, other.name)) 
     { 
      return false; 
     } 
     return true; 
    } 

} 
:

[ 
    [ 
    { 
     "id": "12345", 
     "name": "Teacher" 
    }, 
    [ 
     { 
     "id": "0", 
     "name": "Student0" 
     }, 
     { 
     "id": "1", 
     "name": "Student1" 
     }, 
     { 
     "id": "2", 
     "name": "Student2" 
     } 
    ] 
    ], 
    [ 
    { 
     "id": "23456", 
     "name": "Teacher2" 
    }, 
    [ 
     { 
     "id": "0", 
     "name": "Student0" 
     }, 
     { 
     "id": "1", 
     "name": "Student1" 
     }, 
     { 
     "id": "2", 
     "name": "Student2" 
     } 
    ] 
    ] 
] 

After deserialization: 
Teacher2 
    Student0 
    Student1 
    Student2 
Teacher 
    Student0 
    Student1 
    Student2 

आप equals() और अपने Teacher कक्षा में hashCode() को लागू करते हैं, तब नक्शे से बातें पुनः प्राप्त करने के Teacher का एक नया उदाहरण का उपयोग करने में सक्षम होगा

एक बार आपके पास ऐसा करने के बाद, आप कर सकते हैं:

... 
HashMap<Teacher, List<Student>> map2 = gson.fromJson(json, type); 
Teacher t = new Teacher("23456", "Teacher2"); 
List<Student> list = map2.get(t); 
... 
+1

धन्यवाद आपके मार्गदर्शन समस्या हल – bobo

+1

धन्यवाद संभोग, मैं भी इस समाधान करते थे, लेकिन (कुछ HTC उपकरणों/संस्करणों पर enableComplexMapKeySerialization पर ClassNotFoundException से सावधान एचटीसी खुद को gson शामिल करने का फैसला, और यह एक पुराने संस्करण है, यह भी संस्करण अधिभावी आपके ऐप में शामिल)। – zilinx

+2

लवली स्पष्टीकरण !! मुझे ** enableComplexMapKeySerialization ** – Leeeeeeelo

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