RetrofitのGsonConverterにFieldNamingPolicyを渡すとキー変換が自動化される

  • Android
  • Retrofit
  • Gson
  • Java

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

APIのレスポンスがスネークケース(user_nameとかcreated_atとか)で返ってくるとき、Javaのフィールド名はキャメルケースで書きたい。今まで愚直に@SerializedName("user_name")をフィールドごとに付けてたけど、FieldNamingPolicyを使えばこの作業がまるごと不要になるらしい。

何が起きたか

GsonのGsonBuilderにはsetFieldNamingPolicy()というメソッドがあって、ここにFieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORESを渡すと、Javaのキャメルケースフィールド名を自動でスネークケースに変換してJSONキーとマッチしてくれる。

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

これをRetrofitのGsonConverterFactory.create()に渡すだけ。

Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build();

例えばuserNameというフィールドはuser_nameキーと自動でマッチする。逆に言うと、変換規則から外れるキー(一部だけキャメルケースのまま返ってくるとか)があると、そこだけは変換されないので@SerializedNameで個別に上書きする必要がある。

結論

命名規則が一貫してるAPIなら、FieldNamingPolicyに任せたほうがコードがすっきりする。全フィールドに@SerializedNameを書き並べる必要がなくなるし、フィールド追加のたびにアノテーション付け忘れる事故も減る。ただし規則から外れるキーが混ざってるAPIだと、そこだけ個別対応が必要になる点は覚えておく。