🤔 Kotlin Serialization Guide を眺めてみる
JSON 処理なら、ここらですよね。
どんな扱いになっているのか見てみましょうか。
👉 kotlinx.serialization/serialization-guide.md at master · Kotlin/kotlinx.serialization · GitHub
基本的な使い方「Chapter 1.Basic Serialization」として、以下のようなデータクラスを例に以下のサンプルコード。
@Serializable
class Project(val name: String, val language: String)
val data = Project("kotlinx.serialization", "Kotlin")
println(Json.encodeToString(data))
// {"name":"kotlinx.serialization","language":"Kotlin"}
val data = Json.decodeFromString<Project>("""
{"name":"kotlinx.serialization","language":"Kotlin"}
""")
println(data)
// Project(name=kotlinx.serialization, language=Kotlin)
以下のようなイメージのことを書いてる。
+-----------------------------------+
| |
| Project( |
| name = "kotlinx.serialization", |
| language = "Kotlin" |
| ) |
| |
+-----------------------------------+
| ^
| |
| |
Json.encodeToString(Project) | | Json.decodeFromString(String)
| |
| |
v |
+------------------------------------+
| |
| { |
| "name":"kotlinx.serialization", |
| "language":"Kotlin" |
| } |
| |
+------------------------------------+
汎用的にしてこうですか。
+-----------------------------------+
| T |
+-----------------------------------+
| ^
| |
| |
Json.encodeToString(T) | | Json.decodeFromString<T>(String)
| |
| |
v |
+------------------------------------+
| String |
+------------------------------------+
メソッド名的には、
シリアル化 → encode
逆シリアル化 → decode
となってます。
🤔 JsonElement
というのがあります。
少し試してみます。変換しながら型を見ていきます。
// T
val t = Project(name = "kotlinx.serialization", language = "Kotlin")
println("$t ${t::class.simpleName}")
// Project(name=kotlinx.serialization, language=Kotlin) Project
// T -> JsonElement
val e = Json.encodeToJsonElement(t)
println("$e ${e::class.simpleName}")
// {"name":"kotlinx.serialization","language":"Kotlin"} JsonObject
// JsonElement -> String
val s = Json.encodeToString(e)
println("$s ${s::class.simpleName}")
// {"name":"kotlinx.serialization","language":"Kotlin"} String
// String -> JsonElement
val e2 = Json.parseToJsonElement(s)
println("$e2 ${e2::class.simpleName}")
// {"name":"kotlinx.serialization","language":"Kotlin"} JsonObject
// JsonElement -> T
val t2 = Json.decodeFromJsonElement<Project>(e2)
println("$t2 ${t2::class.simpleName}")
// Project(name=kotlinx.serialization, language=Kotlin) Project
JsonElement の型は JsonObject です。
図にします。
+-----------------------------------+
| T |
+-----------------------------------+
| ^
| |
| |
Json.encodeToJsonElement(T) | | Json.decodeFromJsonElement<T>(JsonElement)
| |
| |
v |
+------------------------------------+
| JsonObject |
+------------------------------------+
| ^
| |
| |
Json.encodeToString(JsonElement) | | Json.parseToJsonElement(String)
| |
| |
v |
+------------------------------------+
| String |
+------------------------------------+
しかし、考えてみると、JsonObject って最近ではあまり見かけなくなった気がします。
🤔 まとめ
以上を図にしておきます。
String
方向が encode(エンコード)
で serialize(シリアル化)
、
T
方向が decode(デコード)
で deserialize(逆シリアル化)
。
Kotlin Serialization を使って JsonObject を作る方法
👉 https://t.co/XCJjz8obGC#ChatGPT #Json #プログラミング教育の日— chanzmao (@maochanz) June 13, 2023