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