你得到NullPointerException
訪問您MapObject
的queryStudent
您MapModel
內,因爲當你試圖反序列化的Json這不是正確填寫。
所以在Gson documentation解決你的問題看,你可以看到:
可以序列與GSON收集而不做任何事情 具體:的toJSON(集合)將寫出所需的輸出。
但是,fromJson(json,Collection.class)的反序列化將 不起作用,因爲Gson無法知道如何將輸入映射到 類型。 Gson要求您在fromJson()中提供 集合類型的通用版本。所以,你有三種選擇:
使用GSON的解析器API(低電平流解析器或DOM解析器 JsonParser)來解析數組元素,然後用Gson.fromJson() 上各自爲陣的元素。這是首選的方法。這裏是 一個演示如何做到這一點的例子。
爲Collection.class註冊一個類型適配器,它查看每個 數組成員並將它們映射到適當的對象。這種方法的缺點 是它會搞亂Gson中的其他集合類型的反序列化。
爲MyCollectionMemberType註冊一個類型適配器,並使用fromJson() 和Collection。
由於您MapObject
containts一個java.util.Map
但你的類本身它不是通用的,我覺得你的情況下,好的方法是創建一個Deserializer
。
在嘗試清理類定義之前,先提供構造函數以使解串器容易構建。你POJO類可能是:
Student類
public class Student{
public String date;
public String seqId;
public String status;
public Student(String date, String seqId, String status){
this.date = date;
this.seqId = seqId;
this.status = status;
}
}
MapObject的類
注:我改變你Map
定義,因爲在你的的Json看來,可能有多個學生每個DynamicName
(看你的問題DynamicName2
),所以我用Map<String,List<Student>>
代替Map<String,Student>
:
public class MapObject{
public Map<String,List<Student>> queryStudent;
public MapObject(Map<String,List<Student>> value){
this.queryStudent = value;
}
}
MapModel類
public class MapModel {
public MapObject map;
}
現在爲您MapObject
創建Deserializer
:
public class MapObjectDeserializer implements JsonDeserializer<MapObject> {
public MapObject deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
Map<String,List<Student>> queryStudents = new HashMap<String,List<Student>>();
// for each DynamicElement...
for (Map.Entry<String,JsonElement> entry : json.getAsJsonObject().entrySet()) {
List<Student> students = new ArrayList<Student>();
// each dynamicElement has an Array so convert and add an student
// for each array entry
for(JsonElement elem : entry.getValue().getAsJsonArray()){
students.add(new Gson().fromJson(elem,Student.class));
}
// put the dinamic name and student on the map
queryStudents.put(entry.getKey(),students);
}
// finally create the mapObject
return new MapObject(queryStudents);
}
}
最後註冊Deserializer
和解析您的的Json:
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(MapObject.class, new MapObjectDeserializer());
Gson gson = builder.create();
MapModel object = gson.fromJson(YourJson,MapModel.class);
免責聲明:快速原型我測試這個使用常規,我儘量保持的Java語法,但我可以忘記什麼的,反正我認爲這可以讓你在正確的方向。
希望它有幫助,
你解決了嗎? – Bharatesh
檢查這個答案,它顯示瞭如何獲得一個對象中的鍵,我認爲你必須手動執行,以獲得所有鍵在「地圖」和迭代http://stackoverflow.com/questions/31094305/java- GSON-得到最列表中,所有按鍵,下一個-的JSONObject – Yazan