JSON → Rust struct 変換ツール
JSONサンプルから、serdeのSerializeとDeserializeをderiveしたRustのstructを生成します。
JSONからserde対応のstructを生成
RustでJSONを読み込む一般的な方法は、serdeとserde_jsonを使ってstructにデシリアライズすることです。このツールはサンプルからそのstructを書き出します。各オブジェクトは#[derive(Serialize, Deserialize)]付きのstructになり、ネストしたオブジェクトには専用のstructが作られ、配列はVec<T>、整数はi64、小数はf64、文字列はStringになります。フィールド名はsnake_caseのまま保たれ、JSONのキーが有効なsnake_caseの識別子でない場合は#[serde(rename = "...")]属性が追加されます。
使い方
- イベントのペイロードや設定ファイルなどのJSONサンプルを貼り付けます。
- ルートstructの名前を入力します(例: Event)。
- Cargo.tomlにserde(deriveフィーチャー付き)とserde_jsonを追加し、structをモジュールに貼り付けて、serde_json::from_str::<Event>(&text)でパースします。
よくある質問
- フィールドがprivateになっているのはなぜですか?
- 生成ツールはフィールドにpubを付けません。モジュール内でserdeを使う分にはこれで十分です。他のモジュールから読み取る必要があるフィールドにはpubを追加してください。
- オプショナルなフィールドはどう表現されますか?
- サンプルの一部の要素でフィールドがnullまたは欠落している場合は、Option<T>として生成されるため、serdeはどちらのケースも受け付けます。常に存在するフィールドは通常の型になり、欠落しているとデシリアライズエラーになります。
- 必要なクレートは?
- features = ["derive"]を指定したserdeとserde_jsonを追加してください。出力の先頭のコメントには古いextern crate形式も記載されていますが、現在のRustエディションでは不要です。
例: JSONからRustへの変換
入力JSON
{
"event_type": "page_view",
"timestamp": 1735689600,
"user_id": "u_123",
"properties": { "path": "/pricing", "referrer": "google" }
}生成されたRust(Event)
// Example code that deserializes and serializes the model.
// extern crate serde;
// #[macro_use]
// extern crate serde_derive;
// extern crate serde_json;
//
// use generated_module::Event;
//
// fn main() {
// let json = r#"{"answer": 42}"#;
// let model: Event = serde_json::from_str(&json).unwrap();
// }
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
pub struct Event {
event_type: String,
timestamp: i64,
user_id: String,
properties: Properties,
}
#[derive(Serialize, Deserialize)]
pub struct Properties {
path: String,
referrer: String,
}