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

このツールでできること

Elixir の struct を JSON にしたいけれど、ちょっとした変換のためだけに JasonPoison を入れたくない — そんなときはここに貼り付けてください。単一の %Order{} リテラル、map、keyword list、入れ子になった struct のチェーン、さらには形の違う map のリストまで対応します。

出力は、struct に @derive Jason.Encoder を付けたあと Jason.encode!/1 が返すものと一致します。__struct__ フィールドは落とされ、atom キーは JSON の文字列キーになり、入れ子の struct は入れ子の JSON オブジェクトに展開されます。リストは JSON 配列、nilnulltrue/false はそのまま、整数は整数、浮動小数はそのまま浮動小数です。

Keyword list ([key: value, other: 1]) は JSON オブジェクトとして出力されます — Elixir の標準的な慣習です。バイナリ文字列も charlist も JSON 文字列に変換されます。DateTimeDateNaiveDateTimeTimeRFC 3339 に沿った ISO-8601 文字列として出力されます。タプルは JSON 配列になります(Jason がカスタムエンコーダで使うのと同じフォールバックです)。

使い方

3 ステップ。1 行の map でも、struct だらけの Phoenix コンテキストモジュールでも同じように動きます。

1

Elixir を貼り付け(またはサンプルを試す)

左側のエディタにコードを入れてください。struct リテラルmapkeyword list入れ子の struct、インスタンス付きの defstruct — すべて問題なく処理できます。

%ModuleName{} 記法、パイプ、defstruct 宣言はそのまま残して大丈夫です。パーサが理解します。

2

「変換」を押す

緑の 変換 ボタンをクリックしてください。ツールは struct を辿り、__struct__ を落とし、入れ子の struct を展開して、一度の処理で JSON を出力します。

3

JSON をコピー

右側のパネルから、インデントされた JSON を取ります。Phoenix の API テスト、ExUnit のフィクスチャ、GraphQL エンドポイントの共有スキーマなどに貼り付けてください。

実際に役立つ場面

Phoenix API のフィクスチャ

コンテキストの schema があって、コントローラテスト用の JSON フィクスチャが欲しい。struct を貼って JSON を保存すれば終わり — IEx でコンパイル&エンコードする必要はありません。

GraphQL レスポンスの形

<a href="https://hexdocs.pm/absinthe/" target="_blank" rel="noopener">Absinthe</a> のリゾルバを書いていて、リゾルバ関数を配線する前に、struct が生む JSON の形を先に確認したい。

Ecto スキーマのドキュメント化

Ecto の schema struct は実質 JSON の契約そのものです。一度 JSON に変換して API ドキュメントとしてコミットし、schema が変わったら同期させる、という使い方ができます。

言語をまたぐデータ受け渡し

Elixir のサービスから Python の ML パイプラインにデータを渡すケース。サンプルの struct を貼り付けて、下流のチームが受け取る JSON を事前に共有できます。

よくある質問

Jason.encode!/1 と一致しますか?

それを目指しています。struct からは __struct__ が落ち、atom キーは文字列キーになり、入れ子の struct は入れ子のオブジェクトに展開されます。ツリー内のすべての struct に @derive Jason.Encoder を付けたときと同じ出力です。

atom はどう扱われますか?

map の atom キーは JSON の文字列キーになります。atom 値は atom 名を含む JSON 文字列になります(たとえば :active"active" になります) — Jason と同じ挙動です。

タプルはどうなりますか?

タプルは JSON 配列になります({1, 2, 3}[1, 2, 3])。厳密には Jason はタプルに対してカスタムエンコーダが必要ですが、データが欠けないよう、このツールは常識的なデフォルトを選びます。

Keyword list と map に違いはありますか?

どちらも JSON オブジェクトとして出力されます。keyword list [name: "Ava", id: 1] と map %{name: "Ava", id: 1} は同じ JSON を生みます。keyword list にキーの重複があれば、最初の出現が残ります。

DateTime や Decimal はどう扱いますか?

DateTime/Date/NaiveDateTime/Time は ISO-8601 文字列になります。Decimal の値は JSON 数値として出力されます(数値文字列の安全性を優先したい場合は文字列になることもあります — ケース次第です)。適切なエンコーダを derive した Jason の出力と同じです。

コードは保存されますか?

変換のためにコードはバックエンドに送られますが、保存はされません — ペイロードはログに残しません。貼り付ける前に、実際のユーザーデータや秘密情報は置き換えておいてください。

ほかに役立ちそうなツール

Elixir to JSON は、ツールボックスのほかの機能と相性が良いです: