動的な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マップを使えば、コンパイル時に正確なキー名を知らなくても柔軟に処理できます。