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


106

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

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


5
私は回答を受け入れることを提案します
JeanValjean

回答:


313

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

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

2
すばらしい回答、ありがとうございます!@janusz、これらの回答のいずれかが役に立った場合は、それらを承認済みの回答としてマークしてください。
sufinawaz 2014

1
名前に2つのアンダースコアが含まれている場合、最初のアンダースコアは無視されます。例 this_key_has__two_underscoresはthisKeyHas_TwoUnderscoresに変換され、その逆も同様です。重要な点は、列挙型がアンダースコア付きの「小文字」であるFieldNamingPolicyですが、変換された名前にはアンダースコア付きの大文字(_T)があります。
Deepak GM

非常にシンプルで、たくさんのフィールドに注釈を付ける必要がなくなります。
ウィリアムT.マラード

98

SerializedNameアノテーションを使用できます。

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

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


2

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

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


2

欲しいものはここにあると思います。注釈を使用して、GSONにmySuperCoolFieldが実際にはJSONでthis_field_is_funと呼ばれ、正しく展開されることを伝えることができます。少なくとも、逆シリアル化でも機能すると思います。

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

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

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

簡単なことは私が今やっていることであり、それはうまくいきます。醜い典型的ではないJavaスタイルのコードはすべてデータクラスに隠されており、外部からは誰もそれを見ることができません。しかし、それはまだ私を少し悩ませています:)
Janusz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.