Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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"

Slide 9

Slide 9 text

そこでkotshi

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

依存追加 dependenceis { … implementation 'se.ansman.kotshi:api:0.3.0' kapt 'se.ansman.kotshi:compiler:0.3.0' … }

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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