TOML ↔ JSON 相互変換
整形処理はすべてブラウザ内で完結します。データは送信されません
TOML(Cargo.toml、pyproject.toml、各種 `*.toml` 設定)を JSON に、あるいはその逆に変換します。完全な TOML 1.0 実装を使っているので、4種類の日付・時刻、複数行文字列、ドットキー、テーブル配列 `[[x]]`、16進数やアンダースコア区切りの数値まで正しく扱えます —— 「key = value とセクションだけ」の自作サブセットは、いずれどこかの入力で黙って別の意味に解釈します。 データを黙って変えてしまう3か所は処理済みです: · ローカルの日付と時刻はタイムゾーン変換しません。 TOML の `1979-05-27` は「その日」であり「その日の 00:00 UTC」ではありません。`07:32:00` にもタイムゾーンはありません。時刻として変換すると、UTC より東の地域では日付が丸一日ずれます。 · 大きな整数は桁を失いません。 2^53 を超える整数は文字列で出力します(`9223372036854775807` を Number にすると `...5808` になります)。型は変わりますが、値は1文字も変わりません。 · `inf` / `-inf` / `nan` は null になりません。 JSON にこれらの値はなく、`JSON.stringify(Infinity)` の結果は `null` です —— エラーにはならず、ただ `inf = inf` が `{"inf": null}` になるだけです。ここでは文字列にするので値が見えます。 逆方向(JSON → TOML)には避けられない問題があります:TOML に null 型はありません。しかも既定の動作はそのキーを丸ごと落とすことです。そこで既定ではエラーにし、どのキーかを示します。設定で空文字列にするか、キーごと省くかを選べます。
機能
- 双方向:TOML → JSON、JSON → TOML。自動判定も手動指定も可能
- 4種類の日付・時刻に対応。ローカルの日付と時刻はタイムゾーン変換しません(しないと日付がずれます)
- テーブル配列 `[[x]]` とオブジェクトの配列を相互変換。ドットキーは入れ子に展開し、引用が必要なキーは引用します
- 大きな整数は BigInt で扱い、2^53 を超えるものは文字列で出力。桁を1つも失いません
- inf / -inf / nan は文字列になります。JSON.stringify のように黙って null にはなりません
- JSON → TOML で null があると、パスを指してエラーにします(TOML に null 型はなく、既定ではキーが消えます)
- null は空文字列にするか、キーごと省くことも選べます。配列内の null は省略できません(後続の添字が変わるため)
- 解析エラーは行と列を指します。「書式が違います」の一言では終わりません
- 最上位がオブジェクトでない場合は「TOML の最上位は常にテーブル」と説明します。ライブラリの英語エラーをそのまま出しません
- 出力はシンタックスハイライト付き。JSON のインデントは 2 / 4 スペースとタブ
使い方
- TOML または JSON を貼り付けます(JSON として解析できれば JSON、それ以外は TOML として扱います)
- 結果はその場で更新されます。方向は手動でも指定できます
- JSON → TOML で null のエラーが出たら、扱いを選んで続行します
- コピーして結果を取り出します
よくある質問
- JSON に null があるとエラーになるのはなぜですか?
- TOML に null 型が存在しないからです。変換した場合の結末は3通りあり、どれも「無損失」ではありません。キーが丸ごと消える(ライブラリの既定動作で最も危険 —— フィールドが1つ欠けた設定を渡されることになります)、空文字列になる(キーは残りますが型が null から文字列に変わります)、キーごと省く。ここでは既定でエラーにし、どのキーかを示します。他の2つは「一見正常だが中身が違う」設定を渡すことになり、しかも何の通知もないためです。どのキーか分かったら、上の設定で選んで続行してください。
- 大きな整数が文字列になったのはなぜですか?inf と nan も?
- JSON がそれらを表現できないからです。2^53 を超える整数は JavaScript で正確に表せません —— `9223372036854775807` は `...5808` になり、下位桁が黙って失われます。`inf` / `-inf` / `nan` に至っては表現自体がありません:`JSON.stringify(Infinity)` の結果は null で、エラーにもなりません。正常に見えて実は間違っている値を出すより、文字列にするほうがましです —— 型は変わりますが値は1文字も変わらず、しかも出力を見れば変化が分かります。
- ローカルの日付にタイムゾーンが付かないのはなぜですか?
- TOML では元々タイムゾーンを持たないからです。`birthday = 1979-05-27` はその日を、`alarm = 07:32:00` はその時刻を表し、どちらも特定の時点を指しません。変換時に「1979-05-27 00:00 UTC」とみなしてあなたのタイムゾーンで表示すると、UTC より東の地域では 5月26日 になり、日付が丸一日ずれます。そこでここでは `1979-05-27` をそのまま出力し、`Z` を付けません。オフセット付きの2形式(`1979-05-27T07:32:00Z` と `...-07:00`)はオフセットを保持します。
- コメントはどこへ行ったのですか?
- JSON にはコメントを保持できる構造がありません —— オブジェクト・配列・スカラーだけです。JSON に変換すればコメントは破棄するしかありません。逆方向(JSON → TOML)には元から保持すべきコメントがありません。コメントが重要な場合は、変換の途中経過とみなさず、元の TOML を保管しておいてください。
関連ツール
YAML 変換
整形YAML と JSON を双方向に変換します。複数ドキュメント、アンカーと別名、マージキーにも対応し、大きな整数も桁を失いません。エラーは行と列で示します。
CSV 変換
整形CSV / TSV と JSON を双方向に変換。区切り文字の自動判別、引用符とフィールド内改行の正しい処理、Excel の BOM 除去、数値は無損失のときだけ変換します。
JSON 整形
整形JSON をブラウザ内で整形・圧縮・検証。折りたたみ可能なツリーで表示し、キーと値の検索、行番号とハイライト付きの編集、Python dict への変換にも対応。
JSON → コード
整形JSON サンプルから TypeScript interface、Go struct、Java class、Rust struct を生成。欠けたキーは任意に、型の衝突は共用型に。すべてブラウザ内で処理します。
SQL 整形
整形SQL をオンラインで整形:キーワードの大文字小文字を統一し、SELECT / FROM / WHERE などの句ごとに改行。圧縮は余分な空白とコメントを削除します。
JSON5 変換
整形JSON5 を標準 JSON に変換。コメント・引用符なしキー・シングルクォート・末尾カンマ・16進数・Infinity に対応し、エラーは行と列を示します。