フラットJSONからの基本的なRust構造体
フラットなJSONオブジェクトを #[derive(Serialize, Deserialize)] と snake_case フィールドを持つRust構造体に変換します。すべての serde プロジェクトの出発点です。
Basics
詳細な説明
フラットJSONからRust構造体を生成する
JSONがネストオブジェクトや配列を含まない場合、出力は1つの struct で、各キーがフィールドに1対1で対応します。
JSONの例
{
"id": 42,
"name": "Alice",
"email": "alice@example.com",
"active": true
}
生成されるRust
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
pub id: i32,
pub name: String,
pub email: String,
pub active: bool,
}
コンバーターが行った判断
idは整数で 32 ビットに収まるためi32になります。2_147_483_647を超える値であればi64が選ばれます。nameとemailはJSON文字列なので、所有権を持つStringにマップされます。所有しない形でデシリアライズしたい場合は&strに変えてライフタイムを付ける選択もありますが、わざわざやる価値があるケースは多くありません。activeはJSONブール値なので、そのままboolになります。- 構造体には
DebugとClone(開発時に便利)に加え、serde_json::from_str/serde_json::to_stringをボイラープレートなしで使えるようにする2つの serde マクロが付与されています。
構造体の使用
let json = r#"{ "id": 42, "name": "Alice", ... }"#;
let user: Root = serde_json::from_str(json)?;
ドメインに合った名前を使いたい場合は、Root struct 入力を Root から User に変更してください。出力は即座に再生成されます。
ユースケース
JSONの設定ファイルを読み込むCLI、スクリプト、REST API を叩くバックエンドサービスのほぼすべてが、この基本パターンから始まります。serde 構造体生成における最小単位の実例です。