動的JSONキー用 HashMap<String, T>

JSONのキーが事前に分からない場合は HashMap<String, T> を使います。serde_json::Value、型付きマップ、BTreeMap の使い分けも解説します。

Type Mapping

詳細な説明

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 でモデル化することで、その都度新しい構造体を量産せずにデータを取り込めます。

試してみる — JSON to Rust Struct Converter

フルツールを開く