Help us understand the problem. What is going on with this article?

GsonとProguard

More than 5 years have passed since last update.

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした