JSON to Rust構造体 (Serde)

JSONを貼り付けるだけで、serde Serialize/Deserialize derive、snake_caseフィールド、Option<T>処理を備えたイディオマティックなRust構造体を生成します。

このツールについて

他社APIのレスポンスに合わせてRust構造体を手書きする作業は、 静的型付けのありがたさを忘れてしまうほど面倒です。このツールはJSON ペイロードを貼り付けるだけで、#[derive(Serialize, Deserialize)] 付きの完全な構造体一式をミリ秒で生成します。Stringi32f64boolVec<T>Option<T> といったイディオマティックな Rust型を自動選択し、ネストオブジェクトを別構造体として切り出し、 JSONキーをRustらしい snake_case に書き換えます。元のキー名とずれる 場合は #[serde(rename = "...")] 属性で安全に保持します。

型推論はJSONツリー全体を走査します。小数点を持たない数値は i32 (32ビットを超える値は i64)、小数点を持つ数値は f64nullOption<serde_json::Value> でラップされ、後から具体型に絞り込め る形で出力されます。JSON配列は最初の要素の型を基に Vec<T> になり、 ネストオブジェクトは親フィールド名から派生した名前付き構造体として 生成されます。例えば shipping_addressShippingAddress 構造体 になります。

同じデータを別言語でも扱う場合、 JSON to TypeScript変換 では interfaceJSON to C#変換 では JsonProperty 属性付きの クラス、JSON to Go変換 では json タグ付きの Go構造体が得られます。マイクロサービス間で同じ型を共有したいときに このRust出力と組み合わせると便利です。

すべての処理はブラウザ内で完結します。貼り付けたJSONはネイティブの JSON.parse() でパースされ、内蔵の推論関数によってRustソース文字列 として組み立てられます。アップロード、ログ記録、サーバー経由の 中継は一切ありません。社内APIレスポンス、認証ペイロード、シークレット を含む設定ファイルなど、外部に出したくないデータでも安心して使えます。 #[derive] の有無、pub 修飾子、Option<T> の付与は任意の タイミングで切り替えられ、出力は即座に再生成されます。

使い方

  1. 左側の JSON Input パネルにJSONを貼り付けるか入力します。
  2. 右パネルのRust構造体出力が入力に応じて自動更新されます。
  3. Root struct 名を設定して、トップレベル構造体の識別子を変更します(デフォルトは Root)。
  4. #[derive(...)] トグルで、標準の Debug, Clone, Serialize, Deserialize derive を付けるかを切り替えます。
  5. pub fields トグルで、各フィールドに pub 修飾子を付与するかを制御します。
  6. serde(rename) はJSONキーが生成された snake_case 名と異なるときに、JSON⇔Rustの相互変換を保つためのリネーム属性を出力します。
  7. Copy ボタンまたは Ctrl+Shift+C で生成コードをコピー。Sample ボタンでサンプルJSONを読み込めます。

JSON to Rust 構造体の人気サンプル

すべての15件のJSON to Rustサンプルを見る &rarr;

よくある質問

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 ギャラリーにこのパターンの解説記事があります。

関連ツール