piapia123
ja

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 スペースとタブ

使い方

  1. TOML または JSON を貼り付けます(JSON として解析できれば JSON、それ以外は TOML として扱います)
  2. 結果はその場で更新されます。方向は手動でも指定できます
  3. JSON → TOML で null のエラーが出たら、扱いを選んで続行します
  4. コピーして結果を取り出します

よくある質問

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 を保管しておいてください。

関連ツール