JSON to Rust構造体 (Serde)
JSONを貼り付けるだけで、serde Serialize/Deserialize derive、snake_caseフィールド、Option<T>処理を備えたイディオマティックなRust構造体を生成します。
このツールについて
他社APIのレスポンスに合わせてRust構造体を手書きする作業は、
静的型付けのありがたさを忘れてしまうほど面倒です。このツールはJSON
ペイロードを貼り付けるだけで、#[derive(Serialize, Deserialize)]
付きの完全な構造体一式をミリ秒で生成します。String、i32、
f64、bool、Vec<T>、Option<T> といったイディオマティックな
Rust型を自動選択し、ネストオブジェクトを別構造体として切り出し、
JSONキーをRustらしい snake_case に書き換えます。元のキー名とずれる
場合は #[serde(rename = "...")] 属性で安全に保持します。
型推論はJSONツリー全体を走査します。小数点を持たない数値は i32
(32ビットを超える値は i64)、小数点を持つ数値は f64、null
は Option<serde_json::Value> でラップされ、後から具体型に絞り込め
る形で出力されます。JSON配列は最初の要素の型を基に Vec<T> になり、
ネストオブジェクトは親フィールド名から派生した名前付き構造体として
生成されます。例えば shipping_address は ShippingAddress 構造体
になります。
同じデータを別言語でも扱う場合、
JSON to TypeScript変換 では interface、
JSON to C#変換 では JsonProperty 属性付きの
クラス、JSON to Go変換 では json タグ付きの
Go構造体が得られます。マイクロサービス間で同じ型を共有したいときに
このRust出力と組み合わせると便利です。
すべての処理はブラウザ内で完結します。貼り付けたJSONはネイティブの
JSON.parse() でパースされ、内蔵の推論関数によってRustソース文字列
として組み立てられます。アップロード、ログ記録、サーバー経由の
中継は一切ありません。社内APIレスポンス、認証ペイロード、シークレット
を含む設定ファイルなど、外部に出したくないデータでも安心して使えます。
#[derive] の有無、pub 修飾子、Option<T> の付与は任意の
タイミングで切り替えられ、出力は即座に再生成されます。
使い方
- 左側の JSON Input パネルにJSONを貼り付けるか入力します。
- 右パネルのRust構造体出力が入力に応じて自動更新されます。
- Root struct 名を設定して、トップレベル構造体の識別子を変更します(デフォルトは
Root)。 - #[derive(...)] トグルで、標準の
Debug, Clone, Serialize, Deserializederive を付けるかを切り替えます。 - pub fields トグルで、各フィールドに
pub修飾子を付与するかを制御します。 - serde(rename) はJSONキーが生成された snake_case 名と異なるときに、JSON⇔Rustの相互変換を保つためのリネーム属性を出力します。
- Copy ボタンまたは Ctrl+Shift+C で生成コードをコピー。Sample ボタンでサンプルJSONを読み込めます。
JSON to Rust 構造体の人気サンプル
よくある質問
JSONの値はどのRust型に変換されますか?
JSON文字列は String、整数は i32(i32 範囲を超える場合は i64)、小数を含む数値は f64、真偽値は bool になります。null は型が決まらないため Option<serde_json::Value> にラップされ、後から具体型に置き換えられます。配列は最初の要素から推論された型で Vec<T> になり、ネストオブジェクトは別の名前付き構造体として切り出されます。
JSONキーはどのようにRustフィールド名に変換されますか?
Rustのコーディング規約に合わせ、すべてのキーは snake_case に正規化されます。正規化の結果が元のJSONキーと異なる場合は #[serde(rename = "originalKey")] 属性が自動付与され、シリアライズ・デシリアライズの互換性が保たれます。type や match のような予約語と衝突するキーは r#type / r#match のように raw identifier 化し、合わせて serde rename を出力して元のキー名を保持します。
null はどのように扱われますか?
JSON の null は単独では型情報を持たないため、デフォルトで Option<serde_json::Value> として出力されます。スキーマが分かっている場合は、貼り付け後に内側の型(例:Option<String>)に手動で書き換えてください。Option<T> トグルをオフにすると、null は素の serde_json::Value に変換されます。
オブジェクト配列なのに構造体が1つしか生成されないのはなぜですか?
配列の要素型推論は、最初の要素を「代表サンプル」として使用します。要素ごとに形が異なる場合は、最も完全な形のオブジェクトを先頭に並べ替えるか、生成後の構造体で欠落しうるフィールドに Option<T> を付与してください。これは serde_json の実行時挙動とも一致しており、Vec の要素は同じ形であることが期待されます。
serde 以外に必要なクレートはありますか?
はい。Cargo.toml に serde(derive feature 付き)と serde_json を追加してください。典型的には serde = { version = "1", features = ["derive"] } と serde_json = "1" の組み合わせです。null 用の Option<serde_json::Value> を扱うために serde_json が必要になります。
データは安全ですか?
はい。JSONはブラウザのネイティブ JSON.parse() でパースされ、Rustソースコードは単純なJavaScriptの文字列連結で構築されます。ネットワーク通信や外部ライブラリへの送信、入力に対する分析は一切行いません。DevToolsのNetworkタブを開きながら貼り付けて、外向きリクエストが0件であることを直接確認できます。
文字列ユニオンを Rust の enum に変換できますか?
1サンプルから「同じフィールドが常に固定の文字列集合を取る」と推論することはできないため、自動変換はサポートしていません。実用的なワークフローとしては、まず String 型のフィールドとして生成し、その後 #[derive(Serialize, Deserialize)] pub enum に手動で置き換えるのが一般的です。Examples ギャラリーにこのパターンの解説記事があります。
関連ツール
JSON → Go構造体変換
JSONからjsonタグと適切な命名規則でGoの構造体定義を即座に生成します。
JSON → TypeScript変換
JSONからネストされた型推論付きでTypeScriptインターフェースや型エイリアスを生成します。
JSON to C# Generator
Convert JSON to C# classes (POCOs) with JsonProperty attributes, nullable types, and nested class support.
JSON → Python変換
JSONからPythonのdataclassまたはTypedDictを生成。型安全なPythonコードを任意のJSON構造から生成。
JSON → Kotlinデータクラス変換
JSONからシリアライゼーションアノテーション付きのKotlinデータクラスを生成します。