JSONのエンコードとデコード
JSONとの相互変換を学びます
「JSONのエンコードとデコード」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
Jsonオブジェクト
Json オブジェクトは、エンコードとデコードの中心です。デフォルトのインスタンスはそのまま使用でき、設定済みのインスタンスを構築することもできます。
import kotlinx.serialization.json.Json
val json = Json文字列にエンコードする
encodeToString を使うと、オブジェクトをJSON文字列に変換できます。
import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
@Serializable
data class Book(val title: String, val pages: Int)
fun main() {
val book = Book("Kotlin in Action", 360)
val text = Json.encodeToString(book)
println(text)
}文字列からデコードする
decodeFromString を使うと、JSONをオブジェクトに戻せます。対象の型は推論されるか、明示的に指定します。
import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
@Serializable
data class Book(val title: String, val pages: Int)
fun main() {
val text = "{\"title\":\"Atomic Kotlin\",\"pages\":500}"
val book = Json.decodeFromString<Book>(text)
println(book.title)
}リストをエンコードする
コレクションは自動的にエンコードされます。シリアライズ可能なオブジェクトのリストは、JSON配列になります。
import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
@Serializable
data class Tag(val name: String)
fun main() {
val tags = listOf(Tag("kotlin"), Tag("json"))
println(Json.encodeToString(tags))
}整形出力
Json { } ビルダーを設定してインデント付きの出力を有効にすると、ログ出力やデバッグに役立ちます。
import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
@Serializable
data class Point(val x: Int, val y: Int)
val pretty = Json { prettyPrint = true }
fun main() {
println(pretty.encodeToString(Point(1, 2)))
}未知のキーを無視する
デフォルトでは、JSONにクラスに存在しないキーが含まれているとデコードに失敗します。ignoreUnknownKeys = true を設定すると、それらを無視できます。APIの進化に対応する際に便利です。
import kotlinx.serialization.json.Json
val lenient = Json { ignoreUnknownKeys = true }デフォルト値をエンコードする
デフォルトでは、デフォルト値と等しいプロパティは書き込まれません。encodeDefaults = true を有効にすると、常に含められます。
import kotlinx.serialization.json.Json
val withDefaults = Json { encodeDefaults = true }JsonElementを扱う
動的なJSONでは、型付きクラスの代わりに JsonElement ツリーへ解析できます。
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonElement
fun main() {
val element: JsonElement = Json.parseToJsonElement("{\"a\":1}")
println(element)
}JsonObjectのフィールドを読み取る
JsonElement を JsonObject にキャストし、キーでフィールドにアクセスしてからプリミティブに変換します。
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import kotlinx.serialization.json.int
fun main() {
val obj = Json.parseToJsonElement("{\"a\":1}").jsonObject
val a = obj["a"]!!.jsonPrimitive.int
println(a)
}ラウンドトリップ
エンコードしてからデコードすると、等しいオブジェクトが戻るはずです(ラウンドトリップ)。モデルの妥当性を手軽に確認する方法です。
import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
@Serializable
data class P(val x: Int)
fun main() {
val original = P(42)
val back = Json.decodeFromString<P>(Json.encodeToString(original))
println(original == back)
}よくあるデコードエラー
次の実行時例外に注意してください:
SerializationException: Unexpected JSON token— 不正なJSON- 必須フィールドがない — JSONにデフォルト値のないプロパティが含まれていない
- 未知のキー —
ignoreUnknownKeysで厳密性を無効にする
理解度チェック
APIによって新しいJSONフィールドが頻繁に追加されます。デコードが失敗しないようにする設定はどれですか?
まとめ
これでオブジェクトとJSONを相互に変換できるようになりました:
encodeToString/decodeFromStringJson { }で設定する:prettyPrint、ignoreUnknownKeys、encodeDefaultsJsonElementで動的なJSONを解析する
次は、サポートされていない型のためのカスタムシリアライザーです。
よくある質問
「JSONのエンコードとデコード」レッスンは無料ですか?
はい。「JSONのエンコードとデコード」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「JSONのエンコードとデコード」で何を学びますか?
JSONとの相互変換を学びます ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「JSONのエンコードとデコード」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- kotlinx.serializationのセットアップ
- Serializableクラス
- JSONのエンコードとデコード
- カスタムシリアライザー