JSON配列からの Vec<T>
JSON配列を、最初の要素から型推論された Vec<T> に変換します。プリミティブ配列とオブジェクト配列の両方を扱います。
Basics
詳細な説明
JSON配列を Vec にマップする
JSON配列は Rust の Vec<T> になり、T は最初の要素から推論されます。プリミティブ配列とオブジェクト配列を同じパスで処理します。
プリミティブ配列
{
"tags": ["rust", "serde", "json"],
"scores": [95, 87, 92]
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
pub tags: Vec<String>,
pub scores: Vec<i32>,
}
オブジェクト配列
{
"users": [
{ "id": 1, "name": "Alice" },
{ "id": 2, "name": "Bob" }
]
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
pub users: Vec<User>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct User {
pub id: i32,
pub name: String,
}
要素構造体の名前は配列フィールド名の単数形から導出されます。users は User、categories は Category になります。addresses は Addres のように単純化されるため、不規則な複数形(children など)は手動で修正してください。
空配列
空のJSON配列 [] には要素型情報がないため、コンパイル可能性を保つために Vec<serde_json::Value> にフォールバックします。実際の構造が判明した時点で、内側の型を本来のものに置き換えてください。
異種配列
実運用の配列は通常同じ形ですが、サンプルに混在形(フィールド数が違うオブジェクトが混ざっている)がある場合は、最も完全な要素を先頭に並べるか、生成後に欠落しうるフィールドを Option<T> でラップしてください。
ユースケース
ページネーションされたリストエンドポイント、バルクインポートペイロード、CSV由来のJSONダンプはいずれもオブジェクト配列として現れます。Vec<T> + serde の組み合わせで安全な反復とフィールドアクセスがワンライナーで実現できます。