KotlinでJSONを扱う

今回はJSONの変換にポンコツ2人組が挑戦しました。KotlinでJSONを扱う方法は いろいろあるみたいですが、当記事ではGsonライブラリを使用する方法と Kotlinの公式シリアライゼーションライブラリを使用する方法を掲載しています。 これらのライブラリを使えば簡単にJSONのパースを行うことができます。

※この記事は2023/11/07時点の情報です。

Gsonライブラリを使用する方法

build.gradleのdependencies内に下記の1行を追記します。バージョンはご自身の環境にあったものを指定して下さい。
implementation 'com.google.code.gson:gson:2.8.8'

次にデータクラスを用意しておきます。nameとageという2つのプロパティを持ったクラスです。

data class Person(val name: String, val age: Int)

メインとなるのが以下のコードです。 オブジェクトをJSONに変換(シリアライズ)するコードと、JSONをオブジェクトに変換(パース)するコードです。 JSON内の各オブジェクトの構造とクラスの構造が一致している必要があります。

// サンプルのPersonオブジェクトのリストを作成
val personList = listOf(
    Person("Alice", 1),
    Person("Latte", 45),
    Person("Ebi", 2)
)

// Gsonオブジェクトを作成
val gson = Gson()

// シリアライズ(オブジェクトをJSONに変換)
val json = gson.toJson(personList)

println("シリアライズされたJSON:")
println(json)
println("")

val jsonString = """
    [
        {"name": "Alice", "age": 1},
        {"name": "Latte", "age": 45},
        {"name": "Ebi", "age": 2}
    ]
""".trimIndent()

val gson2 = Gson()

// パース(JSONをオブジェクトに変換)
val personListType = object : TypeToken<List<Person>>() {}.type
val persons: List<Person> = gson2.fromJson(jsonString, personListType)

println("パースされたオブジェクト:")
persons.forEach { println("Name: ${it.name}, Age: ${it.age}") }

Kotlinの公式シリアライゼーションライブラリを使用する方法

build.gradleのplugins内に下記の2行を追記します。バージョンはご自身の環境にあったものを指定して下さい。
id 'org.jetbrains.kotlin.jvm' version '1.9.20'
id 'org.jetbrains.kotlin.plugin.serialization' version '1.9.20'

同じくbuild.gradleのdependencies内に下記の1行を追記します。バージョンはご自身の環境にあったものを指定して下さい。
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0'

次にデータクラスを用意しておきます。nameとageという2つのプロパティを持ったクラスです。 @Serializableアノテーションを記述することがポイントです。

import kotlinx.serialization.*

@Serializable
data class MyDataClass(
    val name: String,
    val age: Int,
    // 他のプロパティ
)

メインとなるのが以下のコードです。 JSONをオブジェクトに変換(パース)するコードです。

import kotlinx.serialization.json.Json

fun main(args: Array<String>) {
    // JSONデータ
    val json = """{"name":"Alice","age":30}"""

    // JSONデータをデシリアライズ(パース)
    val myData = Json.decodeFromString<MyDataClass>(json)

    // データをログ出力する
    println("Name: ${myData.name}, Age: ${myData.age}")
}

少ないコードで簡単に実装することができました。 JSON形式のデータを扱う機会は多いので、このような処理は是非覚えておきたいですね!

管理人情報