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 = "...")]属性が追加されます。

使い方

  1. イベントのペイロードや設定ファイルなどのJSONサンプルを貼り付けます。
  2. ルートstructの名前を入力します(例: Event)。
  3. 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,
}

JSONを他の言語に変換