🔄 JSON⇔TOML変換
JSONとTOMLを、ブラウザ内だけで相互変換します。JSON→TOMLはオブジェクトを [table]、オブジェクトの配列を [[array]]、スカラー配列を [v1, v2] に変換。TOML→JSONはテーブル・配列・インラインテーブル {..}・ドットキー a.b を解析します。外部ライブラリを使わない自前実装です。
入力
TOML
対応するTOML: キー=値、文字列(基本 "..."/リテラル '...'/複数行)、整数(10進・0x/0o/0b・アンダースコア可)、浮動小数、真偽値、配列、テーブル [t]・ネスト [a.b]、インラインテーブル {..}、テーブル配列 [[t]]、ドットキー a.b=v、コメント #。日時(Date/Time)と inf/nan は、JSONに該当する型が無いため文字列として保持します。JSONの null はTOMLに該当が無いため空文字列 "" にします。入力データはブラウザ内だけで処理され、サーバーには送信されません。
解説
TOML(Tom's Obvious, Minimal Language)は、人が読み書きしやすいことを重視した設定ファイル向けのフォーマットです。RustのCargo(Cargo.toml)やPythonのpyproject.tomlなど、開発ツールの設定でよく使われます。本ツールは、そのTOMLとJSONを、外部ライブラリを使わない自前実装でブラウザ内だけで相互変換します。入力データはサーバーに送信されず、オフラインでも動作します。
JSON→TOMLでは、JSONのデータ構造をTOMLの構文に対応づけます。オブジェクトはテーブルになり、最上位のスカラーや配列は key = value として並び、ネストしたオブジェクトは [table] や [a.b] のセクションに、オブジェクトの配列は [[array]](テーブル配列)として書き出します。例えば {"title":"x","owner":{"name":"太郎"},"ports":[80,443]} は、title = "x" と ports = [80, 443] が並び、[owner] セクションに name = "太郎" が入る形になります。TOMLのルートはテーブル(オブジェクト)である必要があるため、最上位が配列や単一の値のJSONは変換できません。
TOML→JSONでは、自前パーサでTOMLを解析してJSONに整形します。対応するのは、キー=値、基本文字列("...")とリテラル文字列('...')・複数行文字列、整数(10進のほか 0x・0o・0b と桁区切りのアンダースコア)、浮動小数、真偽値、配列(多行・入れ子)、テーブル [t] とネスト [a.b]、インラインテーブル {..}、テーブル配列 [[t]]、ドットキー a.b = v、# コメントです。同じ階層でキーが重複していたり、括弧や引用符が閉じていない場合は、行番号付きのエラーメッセージで知らせます。
対応範囲には割り切りがあります。TOMLの日時型(オフセット付き日時・ローカル日時・日付・時刻)はJSONに該当する型が無いため、変換後は文字列として保持します。同じく浮動小数の inf・nan もJSONで表せないため文字列にします。逆にJSON→TOMLでは、JSONの null をTOMLで表せないため空文字列 "" に置き換えます。またTOMLはテーブルより先にキーを書く仕様のため、JSON→TOMLの往復では最上位キーの並び順がテーブルの後ろに移動することがありますが、キーと値の対応(構造)は保持されます。
よくある質問
入力したデータはどこかに送信されますか?
いいえ。すべての変換はお使いのブラウザ内(JavaScript)だけで行われ、入力データがサーバーに送信されることはありません。変換ロジックも外部ライブラリを使わない自前実装なので、業務データや個人情報を含む設定でも安全に変換でき、オフラインでも利用できます。
JSONのオブジェクトはTOMLでどう表現されますか?
ネストしたオブジェクトは [table] セクションになります。例えば {"owner":{"name":"太郎"}} は [owner] セクションの下に name = "太郎" と書き出されます。さらに深い入れ子は [a.b] のようにドットでつないだ見出しになります。
オブジェクトの配列はどうなりますか?
全要素がオブジェクトの配列は、テーブル配列 [[名前]] として出力されます。例えば {"servers":[{"name":"a"},{"name":"b"}]} は [[servers]] のブロックが2回繰り返される形になります。数値や文字列だけの配列は [1, 2, 3] のようにインライン配列になります。
TOMLの日時はJSONでどう扱われますか?
JSONには日時型が無いため、文字列として保持します。例えば date = 1979-05-27T07:32:00Z は "1979-05-27T07:32:00Z" という文字列になります。日付だけ・時刻だけの値、スペース区切りの日時も文字列として読み取ります。
TOMLのルートに配列や単独の値を持つJSONは変換できますか?
できません。TOMLの最上位は必ずテーブル(キーと値の集まり)である必要があるため、最上位が配列 [1,2] や単一の値 5 のJSONを渡すとエラーになります。最上位をオブジェクトで包んでから変換してください。
JSONの null はTOMLでどう表現されますか?
TOMLには null に相当する値が無いため、空文字列 "" に置き換えます。null を厳密に区別したい場合は、TOMLへの変換前に扱いを決めておくことをおすすめします。
対応していないTOMLの書き方はありますか?
一般的な設定で使う範囲(テーブル・テーブル配列・インラインテーブル・配列・各種文字列・数値・真偽値・ドットキー・コメント)に対応しています。日時型と inf/nan は文字列として読み取ります。ごく特殊な記法や規格の細部までは網羅していないため、複雑な設定は結果を確認してご利用ください。
変換結果を保存できますか?
「結果をコピー」でクリップボードにコピーできるほか、「ダウンロード」で .toml または .json ファイルとして保存できます。TOML→JSONではインデント幅で「最小化(1行)」を選ぶと、余白を詰めたコンパクトなJSONも得られます。