🤔 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
 



