123

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

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

4

4 に答える 4

347

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

Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .create()
于 2012-08-04T16:26:48.787 に答える
110

SerializedName注釈を使用できます。

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

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

于 2013-10-21T10:23:40.080 に答える
2

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

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

于 2010-09-09T13:37:25.617 に答える
2

あなたが欲しいものはここにあると思います。注釈を使用すると、mySuperCoolField が実際には JSON で this_field_is_fun と呼ばれ、正しく展開されることを GSON に伝えることができます。少なくとも、デシリアライゼーションでも機能すると思います。

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

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

public boolean isXXX() {return this.is_XXX;}
于 2010-09-09T13:46:11.827 に答える