$30 off During Our Annual Pro Sale. View Details »

Intro to kotshi

Intro to kotshi

Yuichi Maekawa

January 26, 2018
Tweet

More Decks by Yuichi Maekawa

Other Decks in Programming

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()