注意! この記事はQiitaにて公開されていた内容をimportしたものです。
これらの内容は場合によっては陳腐化していて役に立たなくなっていたり、有害であったり、現在の著者の主張と異なることがあります。
皆様の判断の上でご利用いただけますと幸いです(度を超してヤバいものは著者に連絡して頂ければ対応します m(_ _)m)


本記事で使用するGsonバージョン: 2.8.1


GsonでJsonのデシリアライズを行う場合、以下のようなコードになると思います。

public class User {
    public String name
}

User user = gson.fromJson(json, User.class);

ジェネリクスを使用しオブジェクトを内包したオブジェクトを定義する場合、以下のようなコードが紹介されています。(GsonのUserGuide.mdを参考に修正)

public class Resp<T> {
    public T data
}

Type type = new TypeToken<Resp<User>>(){}.getType();

Resp<User> userResp = gson.fromJson(json, type);

ところでKotlinでTypeの取得部を書こうとすると以下のようになります。

val type = object: TypeToken<Resp<User>>(){}.type

TypeTokenのコンストラクタがprotectedなので、オブジェクト式で一旦サブクラスにしてやりましょう、ということなんですが、本質的じゃないロジックな気はします。ワークアラウンド的といいますか。

以下のようなstaticメソッドが提供されているので、そちらで代用することができます。こちらのほうが素直な印象を受けました。

Type type = TypeToken.getParameterized(Resp.class, User.class).getType();

Resp<User> userResp = gson.fromJson(json, type);

(参考: https://stackoverflow.com/a/44303941