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);
...
धन्यवाद आपके मार्गदर्शन समस्या हल – bobo
धन्यवाद संभोग, मैं भी इस समाधान करते थे, लेकिन (कुछ HTC उपकरणों/संस्करणों पर enableComplexMapKeySerialization पर ClassNotFoundException से सावधान एचटीसी खुद को gson शामिल करने का फैसला, और यह एक पुराने संस्करण है, यह भी संस्करण अधिभावी आपके ऐप में शामिल)। – zilinx
लवली स्पष्टीकरण !! मुझे ** enableComplexMapKeySerialization ** – Leeeeeeelo