動的なJSONキーをKotlinのMap型で扱う

動的または未知のキーを持つJSONオブジェクトをKotlinのMap型で処理する方法を学びます。Map<String, T>、混合値マップ、イテレーションパターンを解説します。

Collections

詳細な説明

KotlinマップによるJSON動的キーの処理

JSONオブジェクトのキーがコンパイル時に不明な場合、固定プロパティを持つdata classを定義できません。代わりに、KotlinのMap<String, T>型を使用します。

JSONの例

{
  "metrics": {
    "cpu_usage": 72.5,
    "memory_usage": 85.3,
    "disk_io": 45.1
  },
  "labels": {
    "env": "production",
    "region": "us-east-1"
  }
}

生成されるKotlin

data class Dashboard(
    val metrics: Map<String, Double>,
    val labels: Map<String, String>
)

混合値型

値が異なる型を持つ場合、Map<String, Any>またはkotlinx.serializationのMap<String, JsonElement>を使用します:

{
  "settings": {
    "theme": "dark",
    "fontSize": 14,
    "autoSave": true
  }
}
data class Config(
    val settings: Map<String, JsonElement>
)

マップ値へのアクセス

val cpuUsage = dashboard.metrics["cpu_usage"] // Double?
val env = dashboard.labels["env"] ?: "unknown"

// すべてのエントリをイテレーション
dashboard.metrics.forEach { (key, value) ->
    println("$key: $value")
}

Map vs Data Class の判断

data classを使う場合:

  • キーが既知で固定
  • コンパイル時のプロパティアクセスが必要

Mapを使う場合:

  • キーが動的、ユーザー定義、またはレスポンス間で異なる
  • オブジェクトがキーバリューストアとして機能する

ネストされたマップ

data class Config(
    val sections: Map<String, Map<String, String>>
)

これは{ "database": { "host": "...", "port": "..." }, "cache": { ... } }のような両レベルで動的キーを持つJSON構造を処理します。

ユースケース

モニタリングダッシュボード、フィーチャーフラグシステム、キーバリューストアは予測不可能なキーを持つJSONを返します。Kotlinマップを使えば、コンパイル時に正確なキー名を知らなくても柔軟に処理できます。

試してみる — JSON to Kotlin

フルツールを開く