動的JSONキー用 HashMap<String, T>
JSONのキーが事前に分からない場合は HashMap<String, T> を使います。serde_json::Value、型付きマップ、BTreeMap の使い分けも解説します。
詳細な説明
HashMap で動的キーを扱う
JSONオブジェクトのキーがコンパイル時に分からない場合(フィーチャーフラグ、メトリクス名、動的ラベルなど)、struct を定義することはできません。代わりに HashMap<String, T> を使います。
JSONの例
{
"metrics": {
"cpu_usage": 72.5,
"memory_usage": 85.3,
"disk_io": 45.1
},
"labels": {
"env": "production",
"region": "us-east-1"
}
}
推奨されるRust
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
pub metrics: HashMap<String, f64>,
pub labels: HashMap<String, String>,
}
自動コンバーターは1つのサンプルから「キーが動的なオブジェクトだ」と判定することはできません。貼り付けた後、キーが動的だと分かっているネスト構造体を HashMap<String, T> に置き換えてください。
値の型が混在する場合
値の型が { "theme": "dark", "fontSize": 14 } のように異なる場合は、HashMap<String, serde_json::Value> を使い、ランタイムでバリアントをパターンマッチします。
match settings.get("theme") {
Some(serde_json::Value::String(s)) => println!("Theme: {}", s),
_ => {}
}
順序付きの反復
HashMap の反復順は不定です。差分テストやスナップショットテスト、出力安定性が必要な CLI 出力には BTreeMap<String, T> を使うと、キー昇順で反復しつつ同じ serde derive サポートが得られます。
struct を選ぶべきとき
毎回同じキーセットが現れる場合は struct を定義します。マップは実行時のオーバーヘッドが大きく、補完が効かず、コンパイル時のチェックも回避してしまいます。HashMap はキーが本当に変動するときの最後の手段と考えてください。
ユースケース
監視ダッシュボード、フィーチャーフラグシステム、Kubernetes 風のラベルマップは任意のキー/値ペアを返します。HashMap でモデル化することで、その都度新しい構造体を量産せずにデータを取り込めます。