Pro Yearly is on sale from $80 to $50! »

Intro to kotshi

Intro to kotshi

A967476c5855d593710a9a580f6b2aed?s=128

Yuichi Maekawa

January 26, 2018
Tweet

Transcript

  1. Intro to kotshi  kaelaela(Yuichi Maekawa) CyberAgent, Inc.

  2. kotshi? AndroidのJsonパーサー”moshi”をkotlinで使うための アダプターを生成するアノテーションプロセッサライブラリ https://github.com/ansman/kotshi • DroidKaigi-2018でも使ってる https://github.com/DroidKaigi/conference-app-2018/blob/master/app/build.gradle#L136-L137 • SdkSearchでも使ってる https://github.com/JakeWharton/SdkSearch/blob/master/build.gradle#L89-L92

  3. moshi A modern JSON library for Android and Java. https://github.com/square/moshi

    • 最近Gsonよりも好まれていた • Kotlinでも使用可能 Ref: • Intro to Moshi / hkurokawa https://speakerdeck.com/hkurokawa/intro-to-moshi
  4. moshi A modern JSON library for Android and Java. https://github.com/square/moshi

    • 最近Gsonよりも好まれていた • Kotlinでも使用可能 Ref: • Intro to Moshi / hkurokawa https://speakerdeck.com/hkurokawa/intro-to-moshi
  5. moshi-kotlin • Square謹製 • moshiライブラリの公式 implementation “com.squareup.moshi:moshi-kotlin:$kotlin_version”

  6. moshi-kotlin • Square謹製 • moshiライブラリの公式 implementation “com.squareup.moshi:moshi-kotlin:$kotlin_version”

  7. moshi-kotlin • 単に同じ名前のプロパティのみなら不要 • @Jsonを使い、json名とプロパティ名を変えるとき必要 Cons • リフレクションしている • ので、パースも遅い

  8. kotlinでreflection • Kotlinでリフレクションするにはライブラリが必要 公式ドキュメント: https://kotlinlang.org/docs/reference/reflection.html#reflection • moshi-kotlinを使うとライブラリが追加される • デフォルトで2MB程度ある •

    100KB程度に軽量化したライブラリもあるそう https://github.com/Kotlin/kotlinx.reflect.lite implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
  9. そこでkotshi

  10. kotshi • https://github.com/ansman/kotshi • Jakeのお墨付き • リフレクション無し • なので早い •

    0.3.0からデフォルト値に対応
  11. kotshiは早いのか • むっちゃ早かった moshi-kotlin Ave: 1300ms ~ 1700ms ⬇ kotshi

    Ave: 70ms ~ 100ms ※@Jsonが1つ,3つの場合で30回ずつ • 計測したサンプル置いておきます https://github.com/kaelaela/KotshiSample moshi-kotlinを試すときはコミット戻してください
  12. 依存追加 dependenceis { … implementation 'se.ansman.kotshi:api:0.3.0' kapt 'se.ansman.kotshi:compiler:0.3.0' … }

  13. @JsonSerializableをつける @JsonSerializable data class Person( val name: String, val email:

    String?, @Json(name = "created_at") val signUpDate: Date, @Json(name = "job_title") val jobTitle: String?, @JsonDefaultValueInt(0) val age : Int )
  14. Build /build/generated/source/kapt/配下にコード生成されます

  15. AdapterFactoryを作る @KotshiJsonAdapterFactory abstruct class AppJsonAdapterFactory : JsonAdapter.Factory { Companion object

    { val INSTANCE: AppJsonAdapterFactory = KotshiApplicationJsonFactory() } )
  16. AdapterFactoryを作る @KotshiJsonAdapterFactory abstruct class AppJsonAdapterFactory : JsonAdapter.Factory { Companion object

    { val INSTANCE: AppJsonAdapterFactory = KotshiApplicationJsonFactory() } )
  17. moshiのbuilderに渡す val moshi = Moshi.Builder() .add(AppJsonAdapterFactory.INSTANCE) .build()