JSON を TOML に変換

ここで JSON を TOML に変換できます。無料、アカウント不要です。ファイルを上の枠に落とせば、数秒で結果がダウンロードできる状態になります。 変換はお使いのブラウザーの中で行われるので、ファイルはアップロードされません。Windows でも macOS でも Linux でも、iPhone でも Android でも同じように動き、通信を切っても動き続けます。

  • 処理される場所 ブラウザーの中です。ファイルがアップロードされることはありません。
  • 可逆 何も捨てられません。TOMLはJSONが持っていたものをそのまま保持します。
  • ファイルサイズの上限 1ファイルあたり100MBまで。無料、アカウント不要です。

一度に100ファイルまで。フォーマットが混ざっていても構いません。

TOML が JSON の設定ファイルにないものを提供する

JSON にはコメントがありません。これは見落としではなく仕様書に明記されていることで、JSON で書かれた設定の保守が不快になる最大の理由です。タイムアウトが 45 秒である理由を、その 45 の隣に書いておく場所がないのです。TOML は 8 年間の 0.x 版を経て 2021 年 1 月に 1.0 に到達し、いまでは Cargo や pyproject.toml、Hugo の設定形式になっていますが、コメントを持っています。これがこの変換のほぼすべての動機です。

2 つ目の理由は平坦さです。3 段の入れ子を持つ JSON の設定は、3 段の中括弧と大量のインデントになります。同じものを TOML にすると、[server.tls.client] という見出し行と、その下の短いキーの一覧になります。データは何も変わっていませんが、レビュアーが 1 つの値の移動を見るときの差分は、再インデントされたブロックではなく 1 行になります。

JSON の配列は TOML ファイルの先頭に居場所がない

TOML の文書はテーブルです。JSON の文書のように配列で始めることができないので、最外殻の文字が角括弧であるファイルは、対応させる先がありません。この変換は失敗するのではなく対処します。オブジェクトではない値は items というキーの下に包まれ、出力は [[items]] から始まります。

これはファイルを有効に保ちますが、答えというより仮の置き場です。そのリストがファイルを読むツールにとって dependencies と呼ばれるべきか、servers と呼ばれるべきか、plugins と呼ばれるべきかを、どんな変換ツールも知りようがありません。最初の行のキー名をリネームすれば、ファイルの残りはすでに正しくなっています。1 単語の編集で済み、隠すのではなくあえて目立つようにしてあります。

JSON の null に対応する TOML はなく、消える

これは毎回確認する価値のある落とし穴です。TOML には null リテラルがなく、書き出す処理もそれを新たに作り出しません。JSON の値が null だったキーは単に書かれません。{"a": null} を変換すると、出力は空のファイルになります。本物のキー 1 つと null のキー 1 つを持つテーブルを変換すると、本物のキーだけが現れます。

これが問題になるかどうかは、結果を読むツール次第です。多くの設定パーサーは、キーが存在しないことと null であることを同じように扱い——どちらも既定値にフォールバックします——その場合は何も失われていません。それらを区別するツールもあり、その場合はこの変換が静かに設定を変えてしまったことになります。防御策は、あとで 2 つのファイルを見比べるのではなく、変換する前に JSON の中の null を検索することです。存在しない行は、変わった行よりずっと気づきにくいからです。

JSON のオブジェクトの配列は TOML のテーブルの配列になる

これは、TOML を JSON より弱い形式だと思っている人がたいてい驚く部分です。レコードの一覧は、同じテーブル見出しの繰り返しとして表現されます。[[servers]] が 3 回あれば、それぞれ独自のキーを持つ 3 台のサーバーになります。JSON の配列より冗長ですが、編集はずっと簡単です。4 台目のサーバーを足すには、括弧のバランスを取るのではなく 5 行をコピーするだけで済みます。

メンバーが揃っている必要もありません。最初のオブジェクトが id と name を持ち、2 つ目に region が加わっている配列も、文句を言われずに変換され、TOML は有効なままです。各ブロックは自分が持つキーだけを運びます。これはこのサイトの表形式の変換先に対する本物の優位性です。表形式では、何かを書き出す前に異種混合の配列を 1 組の列にすり合わせる必要があるからです。

なぜ TOML の出力はキーの順序を変えるのか

TOML のテーブル見出しは、次の見出しまでのすべてを自分のものとします。つまり [server] のあとに置かれた素のキーは、書いた人の意図にかかわらず server に属することになります。そのため、書き出し処理はすべてのトップレベルのスカラー値を最初のテーブル見出しより上に引き上げます。{"server": {"host": "localhost"}, "debug": true} は debug = true、空行、[server]、host という順で出てきます。

したがって出力は JSON にあった順序ではなく、そうすることもできません。これは意味を保つ唯一の並べ替えで、他のどんな並べ替えもキーがどのテーブルに属するかを変えてしまいます。元のグループ分けが読みやすさのために重要だったなら、個々のキーを見出しの上下に動かすのではなく、テーブルのブロックごと動かして復元してください。それなら安全です。

深く入れ子になった JSON はドット区切りの TOML 見出しになる

4 段の JSON の入れ子は 1 行の見出しになります。{"a":{"b":{"c":{"d":1}}}} は [a.b.c] と、その下の d = 1 に変換されます。TOML は深さをインデントではなく見出しの中で表現するので、深く構造化された設定は、元の JSON より TOML のほうが短く平坦になることがよくあります。

妥当性ではなく好みの問題としての限界もあります。[build.targets.linux.arm64.flags] のような見出しは合法ですが、誰も読んで楽しくはありません。変換されたファイルに 3、4 段を超える見出しがあるなら、たいていそれは設定を別のファイルや別のツールに分割すべきだというサインで、この変換は既存の問題を目に見えるようにしただけです。

TOML のコメントこそが要点で、この変換はそれを書けない

出力にコメントは含まれません。入力側にそれを保つ場所がなかったからです。JSON はコメントを運ばないので、翻訳するものが何もありません。これは変換ツールの欠陥ではなく、そもそも JSON をやめる価値があった理由です。

だからこそ、変換したあとの最初の 5 分がこの作業でいちばん価値のある時間になります。TOML ファイルは、この設定についての組織の知識を保持できるバージョンです。どの値なら安全に変更できるか、どれが別のリポジトリの値と一致していなければならないか、なぜある上限がその値に設定されているか。その知識はいま誰かの頭の中か、コミットメッセージの中にしかなく、それをファイルに書き込むのに何のコストもかからない、まさにこの瞬間です。

タイムスタンプは文字列のまま——JSON に日付型がなかったから

TOML はオフセット付き日時を含む 4 種類の日付・時刻型を持ち、それらは文字列ではなく第一級の値です。JSON にはそれがありません。RFC 8259 が与えるのは文字列、数値、真偽値、null、配列、オブジェクトだけで、地球上のすべての JSON ファイルのすべてのタイムスタンプは、慣例として最初の 2 つのどちらかです。

そのため "2024-01-01T00:00:00Z" という JSON の値は、引用符付きの TOML の文字列として書かれます。これは正しくもあり、この形式が表現できたはずのものではありません。ファイルを読むツールが本物の日時を求めているなら、その行の引用符を手作業で外してください。そのあとは日付として解析され、ファイルの他の部分は何も変える必要がありません。

コミットする前に TOML を読み返す

いちばん安上がりな確認は往復です。TOML を JSON に戻し、最初のものと比べてください。null だったキーは欠けているはずで、それ以外は変わっていないはずです。漠然とした不安を、数秒で読める差分に変えられます。

2 つ目の確認はツールそのものです。Cargo や Hugo、ほとんどの Python パッケージングツールは、文書が解析できるか、キーが期待どおりの場所にあるかをすぐに教えてくれます。これは往復確認では捕まえられないもの、つまり正しく変換されたのに、誰もリネームしなかったせいでトップレベルのキーがまだ items のままになっているファイルを見つけてくれます。

JSON から TOML への変換はどこで動くか

このブラウザーのタブの中、あなた自身のプロセッサーの上です。両方とも JavaScript です。JSON のパーサーはブラウザーに組み込まれたもので、TOML のライターは必要に応じて読み込まれる小さなライブラリです。ファイルをどこかへ運ぶリクエストは発生せず、アカウントも待ち行列も 1 日の上限もありません。無料枠は 100 MB までのファイルを受け付け、設定ファイルにとって誰も届かない容量です。

これは、たいていのデータ以上に設定にとって重要です。JSON の設定ファイルは、まさに内部のホスト名やバケット名、サービスアカウント、そしてときには消し忘れた認証情報を持っている種類のものであり、それを Web の変換ツールにアップロードすることこそ、実際に方針違反になる部分です。ここではアップロードするものが何もありません。

JSON を TOML に変換する手順

  1. お手元の JSON ファイル をこのページに落とすか、押してファイルを選んでください。
  2. 変換先に TOML を選びます。変換はブラウザーの中で行われ、ファイルはアップロードされません。
  3. できあがった TOML ファイル をダウンロードします。

JSON と TOML——何が変わるか

JSONとTOMLの比較
JSONTOML
正式名称JavaScript Object NotationTom's Obvious Minimal Language
拡張子.json.toml
メディアタイプapplication/jsonapplication/toml
最初の公開20012013
仕様RFC 8259TOML 1.0
ライセンスオープン標準オープン標準
現在の位置づけ現行現行
ブラウザで開けるかすべてのブラウザ対応なし
代わりに検討される形式XML, YAML, NDJSONYAML, INI

残るもの

失われるものはありません。JSON も TOML も中身を劣化なしに保持します。この変換が変えるのは包み方であって品質ではないので、劣化が積み重なる心配をせずに何度でも繰り返せます。

結果を開く

TOML を読めるブラウザーはありません。その点では、2 つのうち通用する場所が狭いのはこちらです。送る前に、受け取る側がこれを受け付けるかどうか確かめてください。

Visual Studio Codeは JSON と TOML のどちらも読めるので、別のプログラムを開かずに、結果を元のファイルと並べて確かめられます。

どちらの形式が何のためのものか

2 つは狙っている用途が違います。JSON はプログラム間のデータ受け渡しとウェブ、TOML は編集です。ここは考える価値があります。一方が存在する理由が、そのままもう一方が使いにくい理由になっていることが多いからです。

JSON は 2001 年に登場しました。 RFC 8259 で規定されています。ファイルが、それを書いた道具より長く生きなければならないなら、この一点には値打ちがあります。

TOML は 2013 年から使われています。規定は TOML 1.0 です。Visual Studio Codeがこの形式を読めます。

JSON から TOML:よくある質問

JSON ファイル はどこかにアップロードされますか。

いいえ。この変換は完全にブラウザーの中で行われるので、ファイルが端末から出ることはありません。ご自分で確かめられます。開発者ツールのネットワークタブを開いて、何か変換してみてください。ページそのものと、このサービスの費用をまかなっている分析・広告のリクエストは見えますが、あなたのファイルを運んでいるリクエストはひとつもありません。

JSON から TOML への変換は無料ですか。

はい。アカウントも透かしもなく、消費される 1 日の割り当てもありません。お使いの機械の上で動くので、何度でも戻ってきていただけます。ブラウザーが扱えるのは 100 MB までのファイルで、一度に 100 本です。

JSON を TOML に変換すると品質は落ちますか。

いいえ。TOML は同じ内容を何も捨てずに保持できるので、結果は品質の点で元のファイルと同じです。

TOML ファイル はブラウザーで開けますか。

TOML を読めるブラウザーはありません。その点では、2 つのうち通用する場所が狭いのはこちらです。送る前に、受け取る側がこれを受け付けるかどうか確かめてください。

JSON から TOML への変換は可逆ですか。

失われるものはありません。JSON も TOML も中身を劣化なしに保持します。この変換が変えるのは包み方であって品質ではないので、劣化が積み重なる心配をせずに何度でも繰り返せます。

これらのフォーマットについて