言わずと知れたGsonです。
APIからの返り値(json)をGsonでデシリアライズするさいに、知っておいた方がいいなと思うことを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という裏ボスがいるので、そちらも併せて使うようでしたら、使ってもいいかもしれません。