2014-02-09 14 views
6

Im konsumieren einer Clients JSON API mit googles GSON lib Serialisierung/Deserialisierung zu handhaben. Dies erweist sich als problematisch, da in den json-Entitäten der API eine Reihe von Datumsformaten über die API verteilt sind.deserialize zwei verschiedene Datumsformate mit GSON

Einige Beispiele hierfür sind wie folgt ...

"2014.02.09"

"15/10/1976"

„2014-02-09T07: 32: 41 +00: 00 "

Ich habe keine Kontrolle über die API, wie sie vom Kunden entwickelt wurde und bereits von anderen Parteien konsumiert wird. Es scheint, dass ich GSON einrichten kann, um mit einem einzigen Datumsformat zu arbeiten, aber ich kann es nicht die Daten pro Feld analysieren.

Ich hätte erwartet, dass GOSN eine Anmerkung dafür liefern würde, aber ich kann anscheinend nicht finden. Irgendwelche Ideen auf ho, das irgendjemand aufzustellen?

+1

Beachten Sie, dass JSON kein Standard-Datumsformat definiert. Datumsangaben können in jedem Zeichenformat oder in Sekunden oder Millisekunden seit einem bestimmten Datum sein - es liegt ganz allein beim Absender. –

Antwort

6

Da Sie in Ihrem POJO mehrere Felder Date haben und das eingehende JSON diese Daten in verschiedenen Formaten hat, müssten Sie einen benutzerdefinierten Deserializer für Date schreiben, der diese Formate verarbeiten kann.

class DateDeserializer implements JsonDeserializer<Date> 
{ 
    @Override 
    public Date deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException 
    { 
     String myDate = je.getAsString(); 
     // inspect string using regexes 
     // convert string to Date   
     // return Date object 
    } 

} 

können Sie das Register dies als eine Art Adapter, wenn Ihre Gson Instanz:

Gson gson = new GsonBuilder() 
       .registerTypeAdapter(Date.class, new DateDeserializer()) 
       .create(); 

Sie können natürlich auch nur einen benutzerdefinierten Deserializer für Ihre POJO schreiben und alles, was dich aus dem bevöl Baum analysieren.

Eine andere Option wäre, sie einfach als String in Ihrem POJO zu setzen und dann die Getter für jedes Feld in Date umzuwandeln.

Abgesehen davon, wenn Sie nicht vollständig mit Gson verbunden sind, verwendet der Jackson JSON-Parser (standardmäßig) die POJO-Setter während der Deserialisierung, die Ihnen die explizite Kontrolle über die Einstellung jedes Feldes geben würde.

+0

Nicht wirklich ideal wegen der Einschränkungen von GSON. Danke für die Information. –

+0

@ carrot_programmer_3 Die andere Option besteht natürlich darin, benutzerdefinierte Deserializer für Ihre Klassen zu schreiben, die mehrere Datumsformate haben. Während das etwas mühsam sein könnte, würde es das Problem lösen. –

Verwandte Themen