web-dev-qa-db-ja.com

JSONスタイルのプロパティ名をGSONでJava CamelCase名に変換します

[〜#〜] gson [〜#〜] を使用して、JSONデータをJavaオブジェクトに変換します。私のすべてのテストで非常にうまく機能します。問題は、実際のオブジェクトにはis_onlineのような名前のプロパティがあることです。 GSONは、それらの名前が完全に等しい場合にのみマップします。GSONが名前をJavaキャメルケースisOnlineに変換するのは良いことです。

JSONデータの作成中にこれが可能であるようです。キャメルケースはJSONでアンダースコアで区切られた単語に変換されます。しかし、これを他の方法で指定する方法は見つかりません。

90
Janusz

下線付きの属性でjsonを読み取り、モデルでキャメルケースを使用すると、次の設定が最適に機能することがわかりました。

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

SerializedName 注釈を使用できます。

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

注:既にFieldNamingPolicyを設定している場合、SerializedNameはその特定のフィールドの設定を上書きします(特別な場合に非常に便利です)。

85
saschoar

あなたの例はエッジケースであることに留意してください。プロパティ「foo」がある場合、そのゲッターは「getFoo」という名前になり、プロパティ「foo_bar」がある場合、そのゲッターは「getFooBar」という名前になりますが、この例では、ブール値とブール値をマッピングしていますJavaの特殊なケースの命名規則。 onlineという名前のプリミティブブールプロパティには、「getOnline」ではなく「isOnline」、さらに悪い場合には「getIsOnline」という名前のゲッターが必要です。ブールラッパーオブジェクト(つまり、ブール)はこの特殊なケースに従うべきではなく、「online」という名前のプロパティには「getOnline」という名前のゲッターが必要です。

したがって、名前に「is」が含まれるブール型のプロパティを持つことはEdgeの場合であり、変換中にこの特定のプレフィックスを削除する必要があります。逆方向では、コードは、jsonオブジェクトを検査して、未加工のプロパティ名と 'is_XXX'バージョンの両方を調べることができます。

2
Jherico

あなたが望むのは ここ だと思います。アノテーションを使用すると、GSONにmySuperCoolFieldがJSONで実際にthis_field_is_funと呼ばれ、正しく解凍されることを伝えることができます。少なくとも、逆シリアル化でも機能すると思います。

それが機能しない場合は、カスタムJsonSerializer/JsonDeserializersを使用できますが、これは素晴らしい動作をしますが、クラスの変更(フィールドを追加するときなど)に合わせて更新する必要があります。自動マジックを失います。

一番簡単な方法(ugいですが、最初の提案が機能しない場合は非常にクリーンでシンプル)は、GSONを満足させる方法でフィールドに名前を付け、好きな名前のアクセサーメソッドを追加することです、例えば.

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