2010-03-03 15 views
72

Ich benutze GSON zu konvertieren JSON Daten, die ich zu einem Java-Objekt. Es funktioniert ziemlich gut in allen meinen Tests. Das Problem ist, dass unsere realen Objekte einige Eigenschaften wie is_online haben. GSON bildet sie nur ab, wenn sie vollkommen gleich benannt sind. Es wäre schön, wenn GSON die Namen in Java camel case isOnline konvertiert.Konvertieren JSON Stil Eigenschaftennamen in Java CamelCase Namen mit GSON

Es scheint, dass dies beim Erstellen der JSON-Daten möglich ist. Camel case wird in JSON in unterstrichene getrennte Wörter konvertiert. Aber ich finde keinen Weg, dies andersherum zu spezifizieren.

+3

Ich würde vorschlagen, eine Antwort zu akzeptieren – JeanValjean

Antwort

2

Denken Sie daran, Ihr Beispiel ist ein Randfall. Wenn Sie eine Eigenschaft 'foo' haben, sollte ihr getter 'getFoo' heißen, und wenn Sie eine Eigenschaft namens 'foo_bar' haben, sollte ihr getter 'getFooBar' heißen, in Ihrem Beispiel mappen Sie jedoch einen booleschen und booleschen Wert Sonderfall Namenskonventionen in Java. Eine primitive boolesche Eigenschaft namens online sollte einen Getter namens 'isOnline' haben, NICHT 'getOnline' oder, noch schlimmer, 'getIsOnline'. Ein Boolesches Wrapper-Objekt (d. H. Boolean) sollte diesem Sonderfall nicht folgen, und eine Eigenschaft namens "Online" sollte einen Getter namens "getOnline" haben.

Boolesche Eigenschaften mit 'is' im Namen sind daher ein Randfall, in dem Sie dieses bestimmte Präfix während der Konvertierung entfernen möchten. In umgekehrter Richtung könnte Ihr Code das json-Objekt sowohl für einen unformatierten Eigenschaftsnamen als auch für eine 'is_XXX' -Version prüfen wollen.

2

Ich denke, was Sie wollen, ist here. Mithilfe von Annotationen können Sie GSON mitteilen, dass das mySuperCoolField in JSON tatsächlich this_field_is_fun heißt und es korrekt entpackt. Zumindest denke ich, dass es auch für die Deserialisierung funktioniert.

Wenn das nicht funktioniert, können Sie benutzerdefinierte JsonSerializer/JsonDeserializers verwenden, die gut funktionieren, aber Sie müssen sie für Änderungen in Ihrer Klasse (wie wenn Sie ein Feld hinzufügen) aktualisieren. Du verlierst die Auto-Magie.

Die einfachste Sache zu tun (die hässlich wäre, aber sehr sauber und einfach, wenn der erste Vorschlag nicht funktioniert) wäre, das Feld auf eine Art und Weise zu benennen, GSON glücklich zu machen, und zusätzliche Accessor-Methoden hinzuzufügen die Namen, die Sie mögen, z

public boolean isXXX() {return this.is_XXX;} 
+0

die einfache Sache ist, was ich im Moment mache und es funktioniert gut. All der hässliche, nicht typische Java-Code ist in den Datenklassen versteckt und niemand von außen wird ihn sehen. Aber es nörgelt mich immer noch ein bisschen :) – Janusz

206

Ich habe die folgende Einstellung funktioniert perfekt beim Lesen json mit unterstrichenen Attributen und mit camelcase in meinen Modellen zu finden.

Gson gson = new GsonBuilder() 
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) 
    .create() 
+15

Dies sollte eine akzeptierte Antwort sein. –

+2

Große Antwort, danke! @janusz, wenn eine dieser Antworten Ihnen geholfen hat, markieren Sie sie bitte als Angenommene Antwort. – sufinawaz

+1

Wenn Sie einen Fall haben, in dem der Name zwei Unterstriche enthält, wird der erste Unterstrich ignoriert. Ex. this_key_has__two_underscores wird in thisKeyHas_TwoUnderscores und umgekehrt konvertiert. Der Schlüsselpunkt ist die FieldNamingPolicy, bei der die Enumeration "Envelope" mit Unterstrichen angibt, während hier der konvertierte Name einen Großbuchstaben mit Unterstreichung (_T) hat. –

62

können Sie die SerializedName Anmerkung verwenden:

@SerializedName("field_name_in_json") 
private final String fieldNameInJava; 

Hinweis: Wenn Sie ein FieldNamingPolicy bereits eingestellt haben, wird SerializedName für dieses spezielle Feld seine Einstellungen überschrieben (ganz praktisch für Sonderfälle).