22
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GsonとProguard

Last updated at Posted at 2014-12-11

AndroidでJsonを扱うライブラリとして有名なGsonですが、
Proguardを有効にしたビルドだと問題が発生します

問題

普通だと

new Gson().fromJson(jsonString, Hoge.class);

jsonStringHogeクラスに変換出来るはずです
しかしProguardを有効にしてあると、Hogeクラスのフィールド名が難読化されて例えばアルファベット1文字に変更されているため、
jsonStringにおけるjsonのキー名とHogeクラスのフィールド名が一致しなくなりfromJsonによるjsonのパースに失敗し、
結果として全てnullが入ったHogeクラスのインスタンスが得られることとなります

解決策

解決策は2つあります

Proguardでリネームしない

例えば

-keepnames class com.example.android.Model.** { *; }

のように、実装したModelパッケージ内の全てのクラスについてクラスとクラスメンバをリネームしないように
設定しておけば解決します
リネームさえ防げばいいので、-keepではなく-keepnamesで十分です

@SerializedNameを使う

Gsonの機能として、クラスのフィールド名とJsonのキー名を一致させなくても
@SerializedNameを使ってフィールド名とキー名を対応させることが出来ます

class Hoge {
	@SerializedName("field_name")
	private String fieldName;
}

とすればフィールド名はfieldNameでJsonのfield_nameとしてパース出来るようになります

proguard難しい...

22
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?