ネストされた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レベル以上)の場合:

  1. 可能な限りフラット化 -- 深くネストされた値を上位レベルで公開するヘルパー拡張関数を作成します。
  2. 意味のある名前を使用 -- 生成されたクラスをドメイン概念を反映する名前に変更します(例:Addressの代わりにShippingAddress)。
  3. ファイルを分割 -- 大きなモデルの場合、各data classを個別のファイルに配置します。

Sealed Classの代替

ネストされたオブジェクトがバリアント(異なる支払い方法など)を表す場合、より良い型安全性のためにプレーンなdata classの代わりにKotlin sealed classの使用を検討してください。

ユースケース

Stripe、GitHub、TwilioなどのサービスのAPIは深くネストされたJSONレスポンスを頻繁に返します。これらをネストされたKotlin data classに変換することで、AndroidおよびKotlinサーバーアプリケーションでのコンパイル時型チェック付きの安全なトラバースが可能になります。

試してみる — JSON to Kotlin

フルツールを開く