2017-02-18 3 views
0

Я пытаюсь разобрать json для созданного класса, но я получаю null в поле этого класса.Parsing json data с модифицированным андроидом

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; 
    } 

Класс Ping:

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

ответ