道産子エンジニア

あなたは何事にも頭角をあらわしたことがない。

kotlinでjsonパースはkotshiがいいかも

potatotips #47で発表してきた内容。

Androidのjsonパース事情

javaでのjsonパースといえば最近はもっぱらgoogle謹製のGsonだったと思う1が、Androidにおいてはsquareが作っているretrofitというHttpクライアントを使うので、それと相性がいいmoshiが好まれる雰囲気があった。

その流れを変えたのがkotshiである。

github.com

ことの発端はやはりjakeの発言だった。

さらに自分で返信をしていて、kotshiが注目されたのだった。

DroidKaigi2018のカンファレンスアプリにも採用され、jake個人が開発しているAndroidのドキュメントとソースコードを見るためのアプリSdkSearchにも採用されている。

これまでにmoshiが好まれるようになったのにはkotlinへのサポートが早くからなされていたことと、僕らはretrofitとokhttpにおんぶに抱っこなので、okioとの相性がいいこともあげられると思う。 しかし、moshiには二つ問題があった。

  • リフレクションを使っている
  • パースが早くない

対してkotshiが優れている部分がリフレクションをしていない点だった。 なぜリフレクションだと遅いのか?という部分についてすごく詳しくは調べていないので推測程度になるが、kotlinでのリフレクションは少し厄介なことが多い。

kotlinでのリフレクション

kotlinではクラスなどの基本的な部分に必要なリフレクションメソッドをkotlin.refrectパッケージ内に持っている。デフォルトでfinalなクラスになるkotlinとrefrectionは切っても離せない部分だと思う。

kotlin.reflect - Kotlin Programming Language

しかしこのパッケージ内で提供できない機能はkotlin.reflect.fullkotlin.reflect.jvmパッケージが提供しており、それらを使用するためにはkotlin-reflectライブラリのインポートが必要になる。 詳しくはリフレクションのドキュメントにある。

Reflection - Kotlin Programming Language

ところでmoshiを普通に使う分にはリフレクションする機能はいらない。ここで重要になるのはjsonのkey名から、自分たちのアプリケーションで使う世界の名前にマッピングするときだ。moshiでは@Jsonアノテーションを使う。そこでメンバ名の取得が必要になり、kotlinのリフレクションがデフォルトではできないのでインポートが勝手に増えることになる。

f:id:yuichi31:20180129133755p:plain

moshiの公式ドキュメントにもこうある。

Kotlin classes work with Moshi out of the box, with the exception of annotations. If you need to annotate your Kotlin classes with an @Json annotation or otherwise, you will need to use the moshi-kotlin artifact, and set up Moshi to use its converter factory. Add the KotlinJsonAdapterFactory last to allow other installed Kotlin type factories to be used, since factories are called in order.

val moshi = Moshi.Builder()
    // Add any other JsonAdapter factories.
    .add(KotlinJsonAdapterFactory())
    .build()

試していないがliteになったライブラリもあるそう。

サンプルなど

パースの速さに関しては最近あまり意識したことがなかったので、すごく簡単なサンプルを書いてみた。複雑なモデルをテストしていないのであくまで参考だと思ってもらいたい。

github.com

スライドも載せておく。計測結果はスライドにあるが、すごく簡単なモデルでも10倍近くの差がでたのは驚いた。kotlinでリフレクションは本当に遅いのだなと感じた。


potatotipsはAndroid/iOSのエンジニアがLTをするための小規模な勉強会であり、今回で47回目にもなる長寿勉強会だ。 人数は2,30人程度でしかやらないため、新卒エンジニアや学生なども気軽に発表できるのでおすすめ。 最近はAndroidの参加者が少なく定員割れしてしまうことが多いので、発表の練習とかコミュニティとの交流を増やしたいときにスッと登録すればすぐにいけると思う。

前回参加したのが39回目だったのでだいぶ時間がたってしまっていた。

blog.kaelae.la

どうでもいいけどkotshiってのはコサ語で豚という意味なのでスライドに散りばめていた。 f:id:yuichi31:20180129140022p:plain f:id:yuichi31:20180129135932p:plain


  1. jacksonをカスタマイズすればGsonよりもパフォーマンスがでるようだが、Gsonの使いやすさと引き換えにするには重すぎるライブラリだ