KotlinでJSONをシリアライズ/デシリアライズする

追記: 2022年7月10日

使い方などを書きました。 Qiita にも同様の記事を投稿しています。

Kotlin Serialization

KotlinでJSONをパースするとき、普段はJSON in JavaやJackson、Gsonなどがある。

これらはJVMで動作するためKotlin/MPPでは使用できない。

そこでKotlin Serializationを使用する。

これはKotlin/MPPで動作するため、JVMはもちろん、JSでも使用可能である。

使ってみる

今回はGradleを使用する。

使用するためにはpluginsとdependenciesの二つを追記する必要がある。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
plugins {
    kotlin("jvm") version "1.6.10"

    // For Serialization
    kotlin("plugin.serialization") version "1.6.10"
}

repositories {
    mavenCentral()
}

dependencies {
    // For Serialization
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2")
}

使用方法

使用方法についてはこの記事を参考にした。

シリアライズするクラスの作成

シリアライズしたいクラスをシリアライズ可能なクラスとして作成します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
@Serializable
data class Fruit(
    @SerialName("name")
    val name: String,

    @SerialName("value")
    val value: Int,

    @SerialName("amount")
    val amount: Int
)

シリアライズするクラスに@Serializableアノテーションを付けます。

対応する値に@SerialNameアノテーションをつけてバインドします。このアノテーションはシリアライズ前後で名前が同じ場合は省略可能です。

シリアライズ / デシリアライズ する

クラスを作成することができれば、あとはシリアライズするだけです。

シリアライズするためには以下のように記述します。

1
2
val apple = Fruit("りんご", 100, 1)
val json = Json.encodeToString(apple)

encodeToString()を用いてインスタンスをJSONにシリアライズしています。

また、デシリアライズするにはdecodeFromString()を用いて以下のように記述します。

1
2
3
4
5
6
7
8
// シリアライズ
val apple = Fruit("りんご", 100, 1)
val json = Json.encodeToString(apple)

// decodeFromString() でデシリアライズ
val fruit = Json.decodeFromString(json)

println(fruit.name) // 結果: りんご

リストを使う場合

リストを用いた場合でも、シリアライズ / デシリアライズを行うことができます。

リストをシリアライズするには以下のように記述します。

1
2
val list = listOf(Fruit("りんご", 100, 1), Fruit("みかん", 500, 3))
val json = Json.encodeToString(list)

デシリアライズを行う場合は、以下のようにListSerializerを用いて記述します。

1
2
3
4
5
6
// シリアライズ
val list = listOf(Fruit("りんご", 100, 1), Fruit("みかん", 500, 3))
val json = Json.encodeToString(list)

// デシリアライズ
val obj = Json.decodeFromString(ListSerializer(Fruit.serializer()), json)

詳しくは

Kotlin Serialization ではこの他にも様々な機能があります。

詳しくはドキュメントを参照してください。

https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/serialization-guide.md

おわりに

Kotlin Serialization はJSON以外のフォーマットもサポートしています。

非常に便利なライブラリなのでもっと有名になってくれると嬉しいです。