2016-05-17 13 views
1
{ 
"localeCode": "", 
"map": { 
    "DynamicName1": [], 
    "DynamicName2": [ 
     { 
      "date": "2016-05-15T00:00:00", 
      "seqId": 1, 
      "status": 10 
     }, 
     { 
      "date": "2016-05-16T00:00:00", 
      "seqId": 83, 
      "status": 10 
     } 
    ], 
    "DynamicName3": [], 
    "DynamicName4": [] 
}, 
"respCode": 100, 
"respMsg": "success", 
"status": 1 
} 

如何正確映射這種json。如果可以看到,Dynamic是一個動態名稱。到目前爲止,我已經做到了這一點:如何使用Gson在我的POJO類上使用動態json值?

public class MapModel { 

public MapObject map; 

public static class MapObject{ 
    public java.util.Map<String, Student> queryStudent; 

    public static class Student{ 
     public String date; 
     public String seqId; 
     public String status; 
    } 
} 
} 

但是,當運行應用程序。我得到NullPointerException。有人能幫助我嗎?

+0

你解決了嗎? – Bharatesh

+0

檢查這個答案,它顯示瞭如何獲得一個對象中的鍵,我認爲你必須手動執行,以獲得所有鍵在「地圖」和迭代http://stackoverflow.com/questions/31094305/java- GSON-得到最列表中,所有按鍵,下一個-的JSONObject – Yazan

回答

1

你得到NullPointerException訪問您MapObjectqueryStudentMapModel內,因爲當你試圖反序列化的Json這不是正確填寫。

所以在Gson documentation解決你的問題看,你可以看到:

可以序列與GSON收集而不做任何事情 具體:的toJSON(集合)將寫出所需的輸出。

但是,fromJson(json,Collection.class)的反序列化將 不起作用,因爲Gson無法知道如何將輸入映射到 類型。 Gson要求您在fromJson()中提供 集合類型的通用版本。所以,你有三種選擇:

  1. 使用GSON的解析器API(低電平流解析器或DOM解析器 JsonParser)來解析數組元素,然後用Gson.fromJson() 上各自爲陣的元素。這是首選的方法。這裏是 一個演示如何做到這一點的例子。

  2. 爲Collection.class註冊一個類型適配器,它查看每個 數組成員並將它們映射到適當的對象。這種方法的缺點 是它會搞亂Gson中的其他集合類型的反序列化。

  3. 爲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語法,但我可以忘記什麼的,反正我認爲這可以讓你在正確的方向。

希望它有幫助,