Edited at

Gsonで@SerializedNameって書くのやめたい

More than 3 years have passed since last update.


CamelCaseとsnake_case

Androidアプリを作っていて、APIからのレスポンスをPOJO変換する過程で、例えばこんなレスポンスがJSONで返ってくる場合、

{

"id": 123,
"name": "Tanaka Taro",
"first_name": "Tanaka",
"last_name": "Taro"
}

モデルとしてこのようなクラスを定義するかと思います。

public class User {

public int id;
public String name;
public String firstName;
public String lastName;
}

この時JSON内のキー名とクラスの変数名が同じ場合は問題ないのですが、そうではない場合があります。Javaでの変数名はキャメルケース(CamelCase)で書くのが通例ですが、JSONのキー名はスネークケース(snake_case)の形をとることが多いためです。

このままでは変換がうまくいかないので、Gsonではそれを回避するために変数に@SerializedNameというアノテーションを別途記述する必要があります。

public class User {

public int id;
public String name;
@SerializedName("first_name")
public String firstName;
@SerializedName("last_name")
public String lastName;
}

あると思ってました。


そんな必要はなかった

Gson gson = new GsonBuilder()

.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create();

Gsonのインスタンス生成時にsetFieldNamingPolicy()を設定してあげるだけで@SerializedNameなしでも問題なく動作しました。知らなかった。。。

FieldNamingPolicyには他にもいくつか種類があって、変数名から受け取るJSONのキー名をよしなに処理してくれます。

FieldNamingPolicy

IDENTITY
someFieldName ---> someFieldName

LOWER_CASE_WITH_DASHES
someFieldName ---> some-field-name

LOWER_CASE_WITH_UNDERSCORES
someFieldName ---> some_field_name

UPPER_CAMEL_CASE
someFieldName ---> SomeFieldName

UPPER_CAMEL_CASE_WITH_SPACES
someFieldName ---> Some Field Name

@SerializedNameは書く時は全部書く、書かない時は全部書かない人なのですが、もし仕方なく一部だけ書いてるという人がいれば試してみてもいいんじゃないでしょうか。