Rust から JSON への変換ツール
Serialize を派生した Rust の struct を貼り付けて、きれいな JSON を受け取りましょう。
このツールでできること
struct を定義して #[derive(Serialize)] を付けたものの、実は JSON がほしいだけなのに serde のボイラープレートを書き、Cargo.toml に serde_json を追加して cargo run を叩く — そんな経験がある方のためのツールです。ここに Rust を貼り付けるだけで、cargo に触れずに有効な JSON が得られます。単一の struct でも、複数型を含むモジュール全体でも、深くネストした Vec や Option でも結果は同じ — すべてのフィールドを保持した、きれいな JSON ドキュメントになります。
このコンバーターは、serde が実際に値をどうシリアライズするかを忠実に追跡します。String と &str は JSON 文字列に、i32、u64、f32、f64 はすべて JSON の数値になります。bool は true/false に、Vec<T>、&[T]、[T; N] は JSON 配列に、HashMap<String, V> や BTreeMap<String, V> は JSON オブジェクトになります。Option<T> が None のときは JSON の null に、Some(value) のときは内側の型がそのままシリアライズされます。タプルは異種配列として出力されます — 詳しい挙動は serde.rs/data-model に記載されているとおりです。
serde の属性もきちんと反映します。#[serde(rename = "x")] は JSON のキーをリネームし、#[serde(skip)] はそのフィールドを削除し、#[serde(flatten)] はネストした struct のフィールドを親オブジェクトに展開します。enum 型はデフォルトで externally-tagged 表現に従います(#[serde(tag = "type")] で変更可能)。複数の struct をまとめて貼り付ければ、それぞれがトップレベルのエントリとして出力されます。Rust 標準ライブラリに axum や actix を組み合わせた Web サービスを扱っているなら、この出力はそのまま統合テストに投入できます。
使い方
3 ステップだけ。struct を 1 つ貼っても、十数種の型を含むモジュール全体を貼っても動作は同じです。
「変換」を押す
緑の 変換 ボタンをクリックします。ツールが Rust を読み取り、すべての struct とフィールドを保持したまま、一気に JSON を出力します。処理中は短いローディング表示が出ます。
JSON をコピーする
右のパネルにインデント付きの JSON が表示されます。reqwest のテスト、axum の統合テスト、OpenAPI のサンプル、curl コマンドなどにそのまま貼り付けてください。再ビルドは不要です。
こんなときに本当に役立ちます
Web サービスのフィクスチャ
axum や actix のリクエスト struct があり、テストや curl 用に JSON が必要なとき。struct を貼り付けて JSON を取って次へ — cargo サイクルは不要です。
CLI の設定テンプレート
clap ベースの CLI に Config struct がある場合。ドキュメントのためだけに独自の <code>Default</code> 実装を書かなくても、ユーザーが編集できる JSON テンプレートに変換できます。
統合テストのシードデータ
ユニットテストの struct リテラルを、統合テスト、モックサーバー、組み込み DB フィクスチャ用の JSON シードファイルに変換します。
コードに追従するドキュメント
実際の Rust 型から README や OpenAPI 仕様用の JSON 例を生成して、ドキュメントがずれていくのを防ぎます。
よくある質問
Cargo.toml に serde と serde_json が必要ですか?
このツール自体には不要です — サーバー側で動作し、あなたのコードをコンパイルすることはありません。自分のアプリ内でランタイムに使う場合は、derive フィーチャ付きの serde と serde_json の組み合わせが定番です。
#[serde(rename)]、#[serde(skip)]、#[serde(flatten)] は反映されますか?
はい。#[serde(rename = "x")] は JSON のキー名をリネームし、#[serde(skip)] はそのフィールドを出力から取り除き、#[serde(flatten)] はネストした struct のフィールドを親に展開します — serde のフィールド属性のドキュメントどおりの挙動です。
Option、Vec、HashMap はどう扱われますか?
Option<T> が None のときは JSON の null になり、Some(v) のときは内側の値をシリアライズします。Vec<T>、スライス、配列は JSON 配列になります。HashMap<String, V> と BTreeMap<String, V> は JSON オブジェクトになり、キーが文字列でないマップはキーを文字列化して扱います。
バリアント付きの enum はどうなりますか?
デフォルトでは、enum のバリアントは externally-tagged 表現({ "VariantName": {...} })になります。#[serde(tag = "type")]、#[serde(untagged)]、#[serde(content = "data")] を付けると internally-tagged、untagged、adjacently-tagged に切り替わります — ツールはそれらの属性を読み取って、対応した出力を生成します。
貼り付けたコードは保存されますか?
変換のためにバックエンドへ送信されますが、保存はしません — ペイロードのロギングも行いません。機密コードを扱うときは念のため内容を確認してから貼り付けてください。
ライフタイムやジェネリクスを含む Rust でも大丈夫ですか?
ライフタイム(&'a str)は無視されます — JSON にはその概念がないためです。具体型で特殊化されたジェネリクス(Vec<User>)は動作します。未特殊化のジェネリクスは null として出力されます。実構文に展開されるマクロは動作します。ここから見えない proc-macro crate に依存するマクロは不透明なものとして扱われます。
一緒に使うと便利なツール
Rust から JSON への変換はパズルの 1 ピース。以下のツールと相性が良いです: