2016-04-22 19 views
0

JSON Struktur sieht wie folgt aus:Retrofit Gson Konverter für verschachteltes JSON-Objekt mit Datum Eigenschaft

"blabla": 1234, 
"blabla2": "1234", 
"object": { 
     "property1": "1234", 
     "property2": "blablab", 
     "property3": "12345", 
     "property4": Date object, 
    } 
} 

Aufgrund dieser Struktur, ich einen benutzerdefinierten Deserializer umgesetzt habe, und gab es in dem TypeAdapter:

.registerTypeAdapter(Date.class, new DateDeserializer()) 
       .registerTypeAdapter(GenericNotificationResponse.class, new NotificationDeserializer()) 
       .setDateFormat("yyyy-MM-dd'T'HH:mm:ss") 
       .create(); 

public class NotificationDeserializer implements JsonDeserializer<GenericNotificationResponse> { 
    @Override 
    public GenericNotificationResponse deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
     JsonObject content = json.getAsJsonObject(); 
     GenericNotificationResponse message = new Gson().fromJson(json, typeOfT); 
     JsonElement notification = content.get("notification"); 
     if (message.mType == 1) 
      message.mNotification = (new Gson().fromJson(notification, Model1.class)); 
     else if (message.mType == 2) 
      message.mNotification = (new Gson().fromJson(notification, Model2.class)); 
     return message; 
    } 
} 

Und die Deserialisierung des inneren Objekts geht gut. Bis vor kurzem, als ich das Modell änderte und auch ein Date-Objekt erhielt, wie in der JSON-Struktur gezeigt, die letzte Eigenschaft. Aus irgendeinem Grund kann es analysieren es nicht, und es wirft einen Fehler, so scheint es, wie der DateDeserializer, dass ich in der TypeAdapter vorbei ist nicht durch die diesen Linien genannt:

message.mNotification = (new Gson().fromJson(notification, Model1.class)); 

message.mNotification = (new Gson().fromJson(notification, Model2.class)); 

Die DateDeserializer arbeitet seit ich Ich benutze es in anderen Modellen und es macht den Trick. Gibt es eine Möglichkeit, die Deserialisierung der Date-Eigenschaft im inneren Json-Objekt zu machen? Vielen Dank!

Antwort

1

Wenn Sie dies tun:

message.mNotification = (new Gson().fromJson(notification, Model1.class)); 

Du Deserialisieren mit einer neuen Gson() Instanz, die nicht die DateDeserializer hat.

versuchen, etwas wie folgt aus:

new GsonBuilder().registerTypeAdapter(Date.class, new DateDeserializer())    
       .setDateFormat("yyyy-MM-dd'T'HH:mm:ss") 
       .create().fromJson(notification, Model1.class)); 

Das Gleiche gilt für Model2 offensichtlich.

+0

Ich werde nur eine Instanz des GSON ich oben erstellen und verwenden Sie es im NotificationDeserializer .. und es funktioniert, danke :) – Alex

Verwandte Themen