左側に Rust を貼り付けて 「変換」 をクリック — JSON に変換しますRust コードを貼り付け

このツールでできること

struct を定義して #[derive(Serialize)] を付けたものの、実は JSON がほしいだけなのに serde のボイラープレートを書き、Cargo.tomlserde_json を追加して cargo run を叩く — そんな経験がある方のためのツールです。ここに Rust を貼り付けるだけで、cargo に触れずに有効な JSON が得られます。単一の struct でも、複数型を含むモジュール全体でも、深くネストした VecOption でも結果は同じ — すべてのフィールドを保持した、きれいな JSON ドキュメントになります。

このコンバーターは、serde が実際に値をどうシリアライズするかを忠実に追跡します。String&str は JSON 文字列に、i32u64f32f64 はすべて JSON の数値になります。booltrue/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 つ貼っても、十数種の型を含むモジュール全体を貼っても動作は同じです。

1

Rust を貼り付ける(またはサンプルを読み込む)

左のエディタに Rust をそのまま貼り付けてください。structtuple struct、バリアント付きの enum複数の型ネストした Vec/Option/HashMap — どれでも大丈夫です。まずは サンプルを読み込む をクリックして現実的な例を見てみるのもおすすめです。

use 文、ライフタイム、derive 属性を削る必要はありません。Rust の構文はそのままで OK — serde 属性もパーサーが読み取る対象です。

2

「変換」を押す

緑の 変換 ボタンをクリックします。ツールが Rust を読み取り、すべての struct とフィールドを保持したまま、一気に JSON を出力します。処理中は短いローディング表示が出ます。

3

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 フィーチャ付きの serdeserde_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 ピース。以下のツールと相性が良いです: