Upgrade to Pro — share decks privately, control downloads, hide ads and more …

kotlinx.serialization

 kotlinx.serialization

Takuji Nishibayashi

October 04, 2020
Tweet

More Decks by Takuji Nishibayashi

Other Decks in Technology

Transcript

  1. kotlinx
    .serialization
    @takuji31
    J Lang Fest Kansai Online #1

    View Slide

  2. ࣗݾ঺հ
    • @takuji31
    • Takuji Nishibayashi
    • Hatena Co., Ltd.
    • App Team
    • ίϛοΫDAYS
    • ΧΫϤϜ
    • δϟϯϓϧʔΩʔʂ

    View Slide

  3. ࣗݾ঺հ
    • Android
    • Kotlin
    • (Flutter / iOS / Material Design etc.)

    !
    https://blog.takuji31.jp

    "
    https://nazuna.takuji31.jp

    #
    https://photo.takuji31.jp

    View Slide

  4. ΞϓϦέʔγϣϯͰJSON΍YAML
    ΍XMLΛಡΜͩΓॻ͍ͨΓͯ͠·͢
    ͔ʁ

    View Slide

  5. AGENDA
    • kotlinx.serializationʹ͍ͭͯ
    • kotlinx.serializationͷ࢖͍ํ
    • ڝ߹ϥΠϒϥϦʔͱͷൺֱ

    View Slide

  6. kotlinx.
    serializationʹ͍ͭͯ

    View Slide

  7. Kotlin੡ͷγϦΞϥΠθʔγϣϯϥ
    ΠϒϥϦʔ

    View Slide

  8. Kotlinެࣜ

    View Slide

  9. ϚϧνϓϥοτϑΥʔϜରԠ

    View Slide

  10. JSONҎ֎ʹ΋ෳ਺ͷϑΥʔϚοτ
    ʹରԠ

    View Slide

  11. ϦϑϨΫγϣϯͳ͠

    View Slide

  12. kaptෆཁ

    View Slide

  13. Null SafetyରԠ

    View Slide

  14. github.com/Kotlin/
    kotlinx.serialization

    View Slide

  15. kotlinx.
    serializationͷ࢖͍ํ

    View Slide

  16. ηοτΞοϓखॱ

    View Slide

  17. plugins {
    kotlin("multiplatform") // or kotlin("jvm") or kotlin("android") etc.
    kotlin("plugin.serialization") version "1.4.10" // Kotlin version
    }
    kotlin {
    sourceSets {
    val commonMain by getting {
    dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.0-RC2")
    }
    }
    }
    }

    View Slide

  18. or github.com/Kotlin/
    kotlinx.serialization#setup

    View Slide

  19. JSON

    View Slide

  20. {
    "id": 1,
    "title": "సੜͨ͠ΒKotlinͩͬͨ݅",
    "author": "@takuji31",
    "stories": [
    {
    "id": 1001,
    "number": 1,
    "title": "ਆ༷ͷϛεͰϓϩάϥϛϯάݴޠʹసੜͨ͠"
    }
    ]
    }

    View Slide

  21. Ϋϥεఆٛ

    View Slide

  22. @Serializable
    data class Comic(
    val id: Long,
    val title: String,
    val author: String,
    val stories: List,
    )
    @Serializable
    data class Story(
    val id: Long,
    val number: Int,
    val title: String,
    )

    View Slide

  23. γϦΞϥΠζ

    View Slide

  24. val comic = Comic(
    id = 1L,
    title = "సੜͨ͠ΒKotlinͩͬͨ",
    author = "@takuji31",
    stories = listOf(
    Story(
    id = 1001L,
    number = 1,
    title = "ਆ༷ͷϛεͰϓϩάϥϛϯάݴޠʹసੜͨ͠",
    ),
    ),
    )
    Json.encodeToString(Comic.serializer(), comic)

    View Slide

  25. val comic = Comic(
    id = 1L,
    title = "సੜͨ͠ΒKotlinͩͬͨ",
    author = "@takuji31",
    stories = listOf(
    Story(
    id = 1001L,
    number = 1,
    title = "ਆ༷ͷϛεͰϓϩάϥϛϯάݴޠʹసੜͨ͠",
    ),
    ),
    )
    Json.encodeToString(comic)

    View Slide

  26. {"id":1,"title":"సੜͨ͠ΒKotlinͩͬͨ","author":"@takuji31","stories":[{"id":1001,"number":1,"title":"ਆ༷ͷϛεͰϓϩάϥϛϯάݴޠʹసੜͨ͠"}]}

    View Slide

  27. !

    View Slide

  28. val comic = Comic(
    ...
    )
    val format = Json {
    prettyPrint = true
    }
    format.encodeToString(comic)

    View Slide

  29. {
    "id": 1,
    "title": "సੜͨ͠ΒKotlinͩͬͨ",
    "author": "@takuji31",
    "stories": [
    {
    "id": 1001,
    "number": 1,
    "title": "ਆ༷ͷϛεͰϓϩάϥϛϯάݴޠʹసੜͨ͠"
    }
    ]
    }

    View Slide

  30. prettyPrintҎ֎ͷΦϓγϣϯ͸
    docs/json.md#json-configuration

    View Slide

  31. σγϦΞϥΠζ

    View Slide

  32. val json = //get json
    val comic: Comic = Json.decodeFromString(json)

    View Slide

  33. val format = Json { ignoreUnknownKeys = true }
    val json = //get json
    val comic: Comic = format.decodeFromString(json)

    View Slide

  34. ڝ߹ϥΠϒϥϦʔ
    ͱͷൺֱ

    View Slide

  35. ൺֱ͢ΔϥΠϒϥϦʔ
    • Gson
    • Jackson
    • Moshi

    View Slide

  36. σγϦΞϥΠζ࣌ͷܗࣜ

    View Slide

  37. ܗࣜ
    • ϦϑϨΫγϣϯ
    • kapt
    • GradleϓϥάΠϯ

    View Slide

  38. ֤ϥΠϒϥϦʔͷσγϦΞϥΠζܗࣜ
    ϥΠϒϥϦʔ ܗࣜ
    Gson ϦϑϨΫγϣϯ
    Jackson ϦϑϨΫγϣϯ
    Moshi ϦϑϨΫγϣϯ/kapt
    kotlinx.serialization GradleϓϥάΠϯ

    View Slide

  39. KotlinͷNull SafetyରԠ

    View Slide

  40. ֤ϥΠϒϥϦʔͷNull SafetyରԠ
    ϥΠϒϥϦʔ ରԠ/ඇରԠ
    Gson ඇରԠ
    Jackson ରԠ(jackson-module-kotlin) 1
    Moshi ରԠ
    kotlinx.serialization ରԠ
    1 https://github.com/FasterXML/jackson-dataformats-text

    View Slide

  41. JSONҎ֎ͷϑΥʔϚοτ΁ͷରԠ

    View Slide

  42. ֤ϥΠϒϥϦʔͷରԠϑΥʔϚοτ(Ұ෦)
    ϥΠϒϥϦʔ ରԠϑΥʔϚοτ
    Gson ͳ͠
    Jackson YAML/CSV/XML/Properties/Protobuf 1 2
    Moshi ͳ͠
    kotlinx.serialization YAML/XML/Properties/Protobuf 3
    3 https://github.com/Kotlin/kotlinx.serialization/blob/master/formats/README.md
    2 https://github.com/FasterXML/jackson-dataformats-binary
    1 https://github.com/FasterXML/jackson-dataformats-text

    View Slide

  43. Kotlin Multiplatform Project(KMP/
    KMM)ରԠ

    View Slide

  44. ֤ϥΠϒϥϦʔͷରԠϑΥʔϚοτ(Ұ෦)
    ϥΠϒϥϦʔ ରԠ/ඇରԠ
    Gson ඇରԠ
    Jackson ඇରԠ
    Moshi ඇରԠ
    kotlinx.serialization ରԠ

    View Slide

  45. ·ͱΊ

    View Slide

  46. ·ͱΊ
    • kotlinx.serialization͸KotlinެࣜγϦΞϥΠθʔγϣϯϥΠϒϥϦʔ
    • ηοτΞοϓͨ͠Β؆୯ʹ࢖͑Δ
    • GradleϓϥάΠϯʹΑΔίʔυੜ੒ͳͷͰ࣮ߦ࣌/Ϗϧυ࣌ͷύϑΥʔϚϯ
    ε͕ྑ͍
    • JSONҎ֎ʹ΋ଟ਺ͷϑΥʔϚοτʹରԠ
    • ϚϧνϓϥοτϑΥʔϜରԠͰiOS΍αʔόʔαΠυͰ΋࢖͑Δ
    • ϚϧνϓϥοτϑΥʔϜରԠ͍ͯ͠ͳ͍ϑΥʔϚοτ΋͋ΔͷͰ஫ҙ

    View Slide

  47. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide