2017-02-18 11 views
0

Ich versuche, Json zu erstellen Klasse zu analysieren, aber ich bekomme Null bei Feld dieser Klasse.Parsing JSON-Daten mit Retrofit Android

json sieht wie folgt aus:

{"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" } 
    ] 
} 

Hier Methode der Nachrüstung:

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

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

Klasse Ping:

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

//getters, setters 
} 

Ich empfange Objekt der Klasse WorkingMonth aber Feld workingDays ist Null. Hilfe wäre sehr willkommen. Vielen Dank!

UPDATE

I-Lösung gefunden zu haben. Ich musste meine benutzerdefinierte Karte Deserializer

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

und dann

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

Welchen Konverter verwenden Sie? Standardmäßig weist keiner der integrierten Konverter Schlüssel und Werte auf HashMap zu. – akash93

+0

Btw @Blackbelt '@ Expose' ist sinnlos, wenn Sie' GsonBuilder.excludeFieldsWithoutExposeAnnotation() ' – akash93

+0

@ akash93 nicht ausdrücklich setzen, verwende ich gson. Ich habe bereits eine Lösung gefunden. Ich musste meinen eigenen Karten-Deserializer schreiben. Die Frage wird mit der Lösung aktualisiert. Danke – mesomagik

Antwort