$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.

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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"

    View Slide

  9. そこでkotshi

    View Slide

  10. kotshi
    ● https://github.com/ansman/kotshi
    ● Jakeのお墨付き
    ● リフレクション無し
    ● なので早い
    ● 0.3.0からデフォルト値に対応

    View Slide

  11. kotshiは早いのか
    ● むっちゃ早かった
    moshi-kotlin Ave: 1300ms ~ 1700ms

    kotshi Ave: 70ms ~ 100ms
    ※@Jsonが1つ,3つの場合で30回ずつ
    ● 計測したサンプル置いておきます
    https://github.com/kaelaela/KotshiSample
    moshi-kotlinを試すときはコミット戻してください

    View Slide

  12. 依存追加
    dependenceis {

    implementation 'se.ansman.kotshi:api:0.3.0'
    kapt 'se.ansman.kotshi:compiler:0.3.0'

    }

    View Slide

  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
    )

    View Slide

  14. Build
    /build/generated/source/kapt/配下にコード生成されます

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide