7
8

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をデシリアライズで使うときのTips

Posted at

言わずと知れたGsonです。

APIからの返り値(json)をGsonでデシリアライズするさいに、知っておいた方がいいなと思うことを3つご紹介します。

  1. 自力でやる方が早い
  2. 難読化する方法
  3. 受け付ける型を動的に変える

OpenWeatherMapのAPI結果を使ってます。
https://openweathermap.org/

github
https://github.com/kojimamasahiro/GsonTest

自力でやる方が早い

Gsonに任せるより、JSONObjectを1つずつ解析した方が処理速度は3割ほど速いです。
可読性や書きやすさがあがりますが、すでに解析するクラスを作成済みの場合は、わざわざGsonにリファクタリングする必要性は少ないかなと思います。
計測時のソース

難読化する方法

progurdを使うとGsonがうまくデシリアライズしてくれない場合の対処方法

ジェネリックスで書くとうまくいかないので、

Gson gson = new Gson();
gson.fromJson(json, OpenWeatherMapForGson.class);

と書くところを

Gson gson = new Gson();
gson.fromJson(json, new TypeToken<OpenWeatherMapForGson>(){}.getType());

のように書くといいです。

返り値の型を動的に変える

二次元配列が空の場合、配列として判定されてしまい、Gsonがうまくデシリアライズしてくれない場合の対処法

自分でデシリアライザーを作る
https://github.com/kojimamasahiro/GsonTest/blob/master/app/src/main/java/sample/kojimamasahiro/gsontest/MainActivity.java#L225

作ったデシリアライザーをGsonに登録する

Gson gson = new GsonBuilder()
        .registerTypeAdapter(OpenWeatherMapForGson.class, new OpenWeatherMapForGsonDeserializer())
        .create();

おわりに

昔にGsonを使ったときは衝撃を受けるくらい感動しましたが、解析速度が遅かったり、APIの仕様によっては、自分でデシリアライザーを作らないといけないで、あまりメリットがないような気がしています。
とはいえ、まだDataBindingという裏ボスがいるので、そちらも併せて使うようでしたら、使ってもいいかもしれません。

7
8
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
7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?