ネストされたJSONオブジェクトをKotlin Data Classに変換する
ネストされたJSONオブジェクトを個別のKotlin data classに変換する方法を学びます。親子関係、命名規則、深いネスト戦略を解説します。
Basic Data Classes
詳細な説明
KotlinでのネストされたJSON処理
実際のJSONにはほぼ必ずネストされたオブジェクトが含まれます。Kotlinでは、各ネストされたオブジェクトが独自のdata classになり、親がその型のプロパティを保持します。
JSONの例
{
"user": {
"name": "Bob",
"age": 30,
"address": {
"street": "123 Main St",
"city": "Springfield",
"zip": "62704"
}
}
}
生成されるKotlin
data class Root(
val user: User
)
data class User(
val name: String,
val age: Int,
val address: Address
)
data class Address(
val street: String,
val city: String,
val zip: String
)
ネストの仕組み
Kotlinでは各ネストされたJSONオブジェクトに個別のdata classが必要です。コンバーターは各ネストレベルに対して別々のクラスを生成し、親キーに基づいてPascalCaseで命名します。2つの異なるオブジェクトが同じキー名を共有する場合、修飾名(例:UserAddress vs CompanyAddress)が使用されます。
ネストされたデータへのアクセス
val root = Json.decodeFromString<Root>(jsonString)
println(root.user.address.city) // "Springfield"
深いネストの考慮事項
深くネストされたJSON(4レベル以上)の場合:
- 可能な限りフラット化 -- 深くネストされた値を上位レベルで公開するヘルパー拡張関数を作成します。
- 意味のある名前を使用 -- 生成されたクラスをドメイン概念を反映する名前に変更します(例:
Addressの代わりにShippingAddress)。 - ファイルを分割 -- 大きなモデルの場合、各data classを個別のファイルに配置します。
Sealed Classの代替
ネストされたオブジェクトがバリアント(異なる支払い方法など)を表す場合、より良い型安全性のためにプレーンなdata classの代わりにKotlin sealed classの使用を検討してください。
ユースケース
Stripe、GitHub、TwilioなどのサービスのAPIは深くネストされたJSONレスポンスを頻繁に返します。これらをネストされたKotlin data classに変換することで、AndroidおよびKotlinサーバーアプリケーションでのコンパイル時型チェック付きの安全なトラバースが可能になります。