F# から JSON へのコンバーター
F# の record や union を貼り付けると、きれいな JSON が返ります。
このツールでできること
F# の record や判別共用体があって、テスト、HTTP 呼び出し、.NET 連携のために JSON ペイロードが必要なとき、手書きは面倒です。ここに F# を貼り付ければ、妥当な JSON が返ってきます。record 一つでも、いくつかのケースを持つ union でも、モジュール全体でも — 同じ流れです。
コンバーターは、F# コードでよく使われる JSON ライブラリの挙動に従います。F# コンバーターを組み込んだ System.Text.Json、Newtonsoft.Json、そして Thoth.Json はいずれも record のフィールドを JSON のキーに変換します — ここでもまさにそれが起きます。int、float、decimal、bigint は JSON の数値になります。bool はそのまま真偽値です。DateTime と DateTimeOffset は ISO-8601 文字列として出力されます。string option は Some x なら値を、None なら null を出します。
判別共用体は判別子付きでシリアライズされ、JSON がきれいにラウンドトリップします。type Status = | Paid | Refunded of Guid は {"Case":"Refunded","Fields":["..."]} として出力されるか、JsonUnionCase 属性が付いていればそのカスタムタグ形式になります — dotnet/fsharp チームのシリアライザーが生成する形と同じです。lists、arrays、sequences はすべて JSON 配列になります。Map<string, 'T> は JSON オブジェクトに、tuples は JSON 配列になります。F# の慣用的なモデリングをさらに深掘りしたいなら、fsharpforfunandprofit.com をブックマークしておくと便利です。
使い方
3 ステップです。record 一つでも Domain.fs 全体でも同じ流れです。
F# を貼り付ける(またはサンプルを試す)
左のエディタに F# をそのまま貼り付けます。record、判別共用体、{ ... } 構文を使った record のインスタンス、あるいは 複数の型 — どれでも OK です。リアルな例を見たいときは サンプルを読み込む をクリックしてください。
module、namespace、open、属性宣言はそのままで大丈夫です — パーサーは必要ないものを無視します。公式の F# 言語リファレンス が頼りになります。
変換をクリック
緑色の 変換 ボタンをクリックします。ツールが F# を読み、record の各フィールドと union の各ケースをたどって、一度で JSON を生成します。実行中は短いローディングインジケーターが表示されます。
JSON をコピー
右側のパネルにインデント済みの JSON が表示されます。Giraffe や Saturn のリクエスト、xUnit のフィクスチャ、Fable のテスト、あるいは API ドキュメントに貼り付けて使ってください。
実際に役立つ場面
Giraffe / Saturn のテストフィクスチャ
テストで Giraffe エンドポイントに POST する JSON ボディが必要なとき。コマンドの record を貼り付けてペイロードを取得し、spec に差し込むだけです。
Fable フロントエンドのモック
F# のドメイン record を Fable や Elmish のフロントエンド用のモック JSON レスポンスに変換できます — 型から乖離する手書きの JS オブジェクトとはもうおさらばです。
Azure Functions のペイロード
F# で書かれた Azure Function を呼び出すための JSON ボディを生成できます — 入力の形を試行錯誤しているときに重宝します。
型と一致するドキュメント
実際の record から直接、API ドキュメントや README 用の JSON サンプルを生成できるので、ドキュメントが遅れを取ることがありません。
よくある質問
Option 型はどうシリアライズされますか?
Some x は値 x になり、None は JSON の null になります。これは Thoth.Json や System.Text.Json の F# コンバーターのデフォルト挙動と一致します。
判別共用体は JSON ではどう表現されますか?
デフォルトでは {"Case":"CaseName","Fields":[...]} — F# にラウンドトリップ可能なタグ付きフォーマットです。コードがカスタム属性(JsonUnionCase など)を使っている場合は、コンバーターがそれを尊重して調整された形を出力します。
DateTime、DateTimeOffset、Guid はどう扱われますか?
DateTime と DateTimeOffset は ISO-8601 文字列として出力されます。Guid は標準的な 8-4-4-4-12 の 16 進文字列になります。System.Text.Json の素の動作と同じです。
lists、arrays、maps はどうマップされますか?
list、array、seq はすべて JSON 配列になります。Map<string, 'T> は JSON オブジェクトになります。tuples は混合型の JSON 配列になり、.NET シリアライザーが生成するものと同じです。
モジュール全体を貼り付けてもいいですか?
はい。トップレベルの record と union はそれぞれ独自の JSON エントリになり、ネストされた record は展開されます。サンプル値を組み立てる let バインディングも拾われます — テストデータ用のモジュールがあるときに便利です。
貼り付けたコードは保存されますか?
F# は変換のためにバックエンドへ送られますが保持しません — ペイロードはログにも残しません。機密性の高いドメインコードは、貼り付ける前に確認してください。
一緒に使えるツール
F# から JSON はあくまで一部です。こちらと相性が良いです: