2017-02-18 75 views
0

我想解析json创建类,但我收到这个类的字段为null。解析json数据与改造android

JSON看起来是这样的:

{"13": [ 
    { "id": 3654, "dateIn": "2017-02-13 13:13:13", "dateOut": "2017-02-13 15:13:13" }, 
    { "id": 3656, "dateIn": "2017-02-13 17:13:13", "dateOut": "2017-02-13 17:13:13" }, 
    { "id": 3655, "dateIn": "2017-02-13 16:13:13", "dateOut": "2017-02-13 17:13:13" } 
    ], 
"14": [ 
    { "id": 3654, "dateIn": "2017-02-13 13:13:13", "dateOut": "2017-02-13 15:13:13" }, 
    { "id": 3656, "dateIn": "2017-02-13 17:13:13", "dateOut": "2017-02-13 17:13:13" }, 
    { "id": 3655, "dateIn": "2017-02-13 16:13:13", "dateOut": "2017-02-13 17:13:13" } 
    ] 
} 

这里是改造的方法:

Call<WorkingMonth> callPings = HelperClass.getService().getPing(month, year); 
callPings.enqueue(new Callback<WorkingMonth>() { 
    @Override 
    public void onResponse(Call<WorkingMonth> call, Response<WorkingMonth> response) { 
     if (response.isSuccessful()) { 
      WorkingMonth wm = response.body(); 
      wm.getWorkingDays(); 
     } else { 

      Log.i(TAG, "error in downloading"); 
     }  
    } 

    @Override 
    public void onFailure(Call<WorkingMonth> call, Throwable t) { 

     Log.i(TAG, t.toString()); 
    } 
}); 

类WorkingMonth:

public class WorkingMonth{ 

    private Map<String,List<Ping>> workingDays; 

    public Map<String,List<Ping>> getWorkingDays() { 
     return workingDays; 
    } 

    public void setWorkingDays(Map<String,List<Ping>> workingDays) { 
     this.workingDays = workingDays; 
    } 

类平:

public class Ping { 
private Long id; 
private String dateIn; 
private String dateOut; 

//getters, setters 
} 

我收到类WorkingMonth的对象,但字段workingDays为null。 帮助将不胜感激。谢谢!

UPDATE

我已经找到了解决方案。我不得不写我的自定义地图解串器

private class HolderDeserializer implements JsonDeserializer<WorkingMonth> { 

    @Override 
    public WorkingMonth deserialize(JsonElement json, Type type, JsonDeserializationContext context) 
      throws JsonParseException { 

     Type mapType = new TypeToken<Map<String, List<Ping>>>() {}.getType(); 
     Map<String, List<Ping>> data = context.deserialize(json, mapType); 

     return new WorkingMonth(data); 
    } 
} 

然后

HolderDeserializer holderDeserializer = new HolderDeserializer(); 
GsonBuilder gsonBuilder = new GsonBuilder(); 
gsonBuilder.registerTypeAdapter(WorkingMonth.class, holderDeserializer); 
Gson gson = gsonBuilder.create(); 

Type responseType = new TypeToken<WorkingMonth>() {}.getType(); 
WorkingMonth response = gson.fromJson(json, responseType); 
+0

您使用的是什么转换器?默认情况下,内置的转换器都不将键和值映射到HashMap。 – akash93

+0

Btw @Blackbelt'@ Expose'是没有意义的,除非你明确地设置'GsonBuilder.excludeFieldsWithoutExposeAnnotation()' – akash93

+0

@ akash93我使用的是gson。我已经找到解决方案。我不得不写我自己的地图解串器。问题用解决方案更新。谢谢 – mesomagik

回答