Frage Konvertieren von JSON-Stil-Eigenschaften in Java CamelCase-Namen mit GSON


Ich benutze GSON um JSON-Daten zu konvertieren, komme ich an ein 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.

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


74
2018-03-03 11:28


Ursprung


Antworten:


Ich habe festgestellt, dass die folgende Einstellung perfekt funktioniert, wenn Sie Json mit unterstrichenen Attributen lesen und Camelcasing in meinen Modellen verwenden.

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

223
2017-08-04 16:26



Du kannst den ... benutzen SerializedName Anmerkung:

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

Hinweis: Wenn Sie a eingestellt haben FieldNamingPolicy bereits, SerializedName überschreibt seine Einstellungen für dieses spezielle Feld (ziemlich praktisch für spezielle Fälle).


64
2017-10-21 10:23



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 spezielle 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
2017-09-09 13:37



Ich denke was du willst ist Hier. 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 aktualisieren (wie wenn Sie ein Feld hinzufügen). Du verlierst die Auto-Magie.

Die einfachste Sache (die hässlich wäre, aber sehr sauber und einfach, wenn der erste Vorschlag nicht funktioniert) wäre, das Feld einfach so zu benennen, dass es GSON glücklich macht, und zusätzliche Accessor-Methoden mit den Namen hinzuzufügen, die du magst , z.B

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

2
2017-09-09 13:46