[〜#〜] gson [〜#〜] を使用して、JSONデータをJavaオブジェクトに変換します。私のすべてのテストで非常にうまく機能します。問題は、実際のオブジェクトにはis_onlineのような名前のプロパティがあることです。 GSONは、それらの名前が完全に等しい場合にのみマップします。GSONが名前をJavaキャメルケースisOnlineに変換するのは良いことです。
JSONデータの作成中にこれが可能であるようです。キャメルケースはJSONでアンダースコアで区切られた単語に変換されます。しかし、これを他の方法で指定する方法は見つかりません。
下線付きの属性でjsonを読み取り、モデルでキャメルケースを使用すると、次の設定が最適に機能することがわかりました。
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create()
SerializedName
注釈を使用できます。
@SerializedName("field_name_in_json")
private final String fieldNameInJava;
注:既にFieldNamingPolicy
を設定している場合、SerializedName
はその特定のフィールドの設定を上書きします(特別な場合に非常に便利です)。
あなたの例はエッジケースであることに留意してください。プロパティ「foo」がある場合、そのゲッターは「getFoo」という名前になり、プロパティ「foo_bar」がある場合、そのゲッターは「getFooBar」という名前になりますが、この例では、ブール値とブール値をマッピングしていますJavaの特殊なケースの命名規則。 onlineという名前のプリミティブブールプロパティには、「getOnline」ではなく「isOnline」、さらに悪い場合には「getIsOnline」という名前のゲッターが必要です。ブールラッパーオブジェクト(つまり、ブール)はこの特殊なケースに従うべきではなく、「online」という名前のプロパティには「getOnline」という名前のゲッターが必要です。
したがって、名前に「is」が含まれるブール型のプロパティを持つことはEdgeの場合であり、変換中にこの特定のプレフィックスを削除する必要があります。逆方向では、コードは、jsonオブジェクトを検査して、未加工のプロパティ名と 'is_XXX'バージョンの両方を調べることができます。
あなたが望むのは ここ だと思います。アノテーションを使用すると、GSONにmySuperCoolFieldがJSONで実際にthis_field_is_funと呼ばれ、正しく解凍されることを伝えることができます。少なくとも、逆シリアル化でも機能すると思います。
それが機能しない場合は、カスタムJsonSerializer/JsonDeserializersを使用できますが、これは素晴らしい動作をしますが、クラスの変更(フィールドを追加するときなど)に合わせて更新する必要があります。自動マジックを失います。
一番簡単な方法(ugいですが、最初の提案が機能しない場合は非常にクリーンでシンプル)は、GSONを満足させる方法でフィールドに名前を付け、好きな名前のアクセサーメソッドを追加することです、例えば.
public boolean isXXX() {return this.is_XXX;}