[Android] 019. JSON

kotlinでJSONを扱う場合GSONやMoshi(Kotshi)などいろいろ選択肢がありますが
オフィシャルのKotlin Serializationを使用してみようと思います

準備

・githubを参照してライブラリバーションなどを確認する https://github.com/Kotlin/kotlinx.serialization

・Project Structuer で追加 org.jetbrains.kotlinx:kotlinx-serialization-json

・android studio の Kotlinのバージョンを確認する Settings – Languages & Frameworks – Kotrin

・Android Studio の Kotlinバージョンと同じにして追加

plugins {
    id "org.jetbrains.kotlin.plugin.serialization" version "1.7.20" apply false
}
plugins {
    id 'kotlinx-serialization'
}

・githubにかかれている内容を追加

# Keep `Companion` object fields of serializable classes.
# This avoids serializer lookup through `getDeclaredClasses` as done for named companion objects.
-if @kotlinx.serialization.Serializable class **
-keepclassmembers class <1> {
    static <1>$Companion Companion;
}

# Keep `serializer()` on companion objects (both default and named) of serializable classes.
-if @kotlinx.serialization.Serializable class ** {
    static **$* *;
}
-keepclassmembers class <2>$<3> {
    kotlinx.serialization.KSerializer serializer(...);
}

# Keep `INSTANCE.serializer()` of serializable objects.
-if @kotlinx.serialization.Serializable class ** {
    public static ** INSTANCE;
}
-keepclassmembers class <1> {
    public static <1> INSTANCE;
    kotlinx.serialization.KSerializer serializer(...);
}

# @Serializable and @Polymorphic are used at runtime for polymorphic serialization.
-keepattributes RuntimeVisibleAnnotations,AnnotationDefault

# Serializer for classes with named companion objects are retrieved using `getDeclaredClasses`.
# If you have any, uncomment and replace classes with those containing named companion objects.
#-keepattributes InnerClasses # Needed for `getDeclaredClasses`.
#-if @kotlinx.serialization.Serializable class
#com.example.myapplication.HasNamedCompanion, # <-- List serializable classes with named companions.
#com.example.myapplication.HasNamedCompanion2
#{
#    static **$* *;
#}
#-keepnames class <1>$$serializer { # -keepnames suffices; class is kept when serializer() is kept.
#    static <1>$$serializer INSTANCE;
#}

実装

import kotlinx.serialization.*
import kotlinx.serialization.json.*

@Serializable
data class Datas(
    @SerialName("datas_name") val name: String,
    @SerialName("datas_num") val num: Int,
)

fun encodeJson() {
    val datas = Datas("test", 123)
    val json = Json.encodeToString(datas)
    // {"datas_name":"test","datas_num":123}
    println(json)
}

fun decodeJson() {
    var json = "{\"datas_name\":\"test\",\"datas_num\":123}"
    val datas = Json.decodeFromString<Datas>(json)
    // Datas(name=test, num=123)
    println(datas)
}

Android Studio Dolphin 2021.3.1 Patch 1 built on September 30, 2022