blog.petitviolet.net

GsonとProguard

2014-12-11

QiitaAndroid

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 難しい…

from: https://qiita.com/petitviolet/items/1b709f3f0db2659a271a