INI を JSON に変換 — セクションをオブジェクトに

INI を JSON にする変換は、セクションごとに 1 つのオブジェクトを作り、セクション名をキーにします。値は途中で型が付き、数字は JSON の数値に、true と false は真偽値になります。ポート番号やタイムアウトには便利ですが、ゼロ埋めされた識別子には破壊的です。すべてブラウザーの中で動きます。

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

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

INI ファイルがどんなオブジェクトになるか

結果は 1 つの JSON オブジェクトです。各セクションヘッダーは、自身のオブジェクトを持つキーになり、そのヘッダーの下にあるキーと値のペアがそのオブジェクトのプロパティになります。どのセクションヘッダーよりも前に書かれたキー——多くのツールがグローバルブロックと呼ぶもの——は、専用の包み紙を持たず、セクションのオブジェクトと並んでトップレベルに置かれます。

これが構造上の変換のすべてです。INI ファイルの中に他に変換すべきものがないからです。この組み合わせを読む価値があるのは形ではなく値のほうで、値は形ほど文字どおりには渡りません。

INI リーダーがあなたに代わって下す型の判断

INI ファイルに型はありません。等号のあとはすべて文字であり、読み込むすべてのプログラムがその意味を自分で決めます。このリーダーはこう決めます。文字列 true と false はそのまま JSON の真偽値になり、有限の数値として解析できるものは JSON の数値になり、それ以外は文字列のままです。

たいていの設定ではこれが正しい判断で、あなた自身が parseInt を通す手間を省きます。ポートは "8080" ではなく 8080 に、タイムアウトは 30 になり、-1 のような負のフラグも比較できる数値になります。代償は、リーダーが量と識別子を区別できないことで、そこで被害が起きます。

ゼロ埋め、16 進数、大きすぎる値

4 つのケースが静かに失敗し、どれも実際の設定ファイルに現れます。ゼロ埋めされた識別子 007 は数値の 7 になります。0755 と書かれた Unix のファイルモードは 755 になり、これは別のモードで、そのまま適用されます。0x1F と書かれた 16 進数のマスクは 31 になり、値としては正しくてもログに出力するたびに違って見えます。1.0 と固定されたバージョン番号は 1 になります。

4 つ目はより微妙です。およそ 900 兆を超える整数は精度を失います。JSON の数値は IEEE の倍精度浮動小数点だからです。64 ビットの識別子 9223372036854775807 は 9223372036854776000 として出てきます。何も警告はありません。あるキーがスノーフレーク ID やシリアル番号、口座参照番号を持つなら、元の INI ファイルの中でそれを引用符で囲んでください。引用符付きの値も解析されるので、より確実な対策は数字以外の文字を前後に付けることか、あとで JSON の中の値を直すことです。

INI の中で無傷のまま残る値

どのキーを確認しなくていいか知っておく価値があります。単位が付いているものは安全で、128M と書かれたメモリー上限は文字列の 128M のままです。ドット区切りのアドレスも文字列のままなので、127.0.0.1 はそのまま渡ります。08:00 のような時刻や、パス、URL、数字の一部ではない文字を含むものも文字列のまま残ります。

等号を含む値も生き残ります。行は最初の等号でだけ分割されるので、接続文字列やクエリパラメータは無傷です。周囲の引用符は取り除かれますが、いちばん外側のペアだけです。引用符の内側にパディングがある値はそのパディングを保ち、引用符のない値は両端がトリムされます。その引用符の内側でだけ、バックスラッシュがエスケープを開始します。バックスラッシュと n は改行に、2 つのバックスラッシュは 1 つになります。これが複数行の値を INI へ、そして戻す往復を生き延びさせる仕組みで、引用符のない Windows のパス C:\new が書かれたとおりに読まれ、引用符の中にある同じパスはそうならない理由です。

On と Off——JSON が認識しない INI の真偽値

Windows の INI ファイルや php.ini は true や false より On と Off をずっと多く使いますが、このリーダーはそれらを真偽値として扱いません。文字列の "On" と "Off" になり、これは擁護できます。所詮ただの単語だからです。しかし JSON の受け手が期待するものとはほぼ一致しません。

同じことが yes と no、フラグとして使われる 1 と 0 にも当てはまり、真偽値ではなく数値の 1 と 0 になります。JSON を読む側が何を真とみなすか自分で決める必要があり、いちばん安全な習慣は、変換がそれらを一貫させたと仮定せず、読み込み側のコードでそのキーを明示的に正規化することです。engine が On で debug が false という設定は、今や 2 種類の「はい」を持つことになります。

キーの順序と、JSON が INI を並べ替える唯一の場合

キーの順序はほぼどこでも保たれ、これは機械ではなく差分を読む人にとって重要です。セクションは登場した順に出てきて、セクション内のキーも書かれた順を保ちます。

例外は数値のキーです。JavaScript のオブジェクトは整数のように見えるキーを昇順でいちばん先に置くので、10、2、name の順で書かれたセクションは 2、10、name の順で出てきます。サーバーの一覧や順序付きルール、プレイリストの項目のように数字をキーに使う INI ファイルは並べ替えられて出てきます。順序が意味を持つファイルなら、そのセクションは JSON の配列になるべきで、それは手作業での修正になります。

重複したセクションはエラーなく消えます

INI には仕様がないので、実装は重複したセクションヘッダーの扱いで一致していません。マージするもの、両方保つもの、最後だけを取るものがあります。このリーダーはヘッダーに出会うたびに空のセクションを新しく始めるので、[logging] を 2 回含むファイルは 2 番目のブロックのキーだけを保ちます。最初のブロックは消え、JSON は有効なままで、何も報告されません。

この現象は設定ファイルを結合して組み立てるときに現れます。ベースファイルに環境ごとの上書きを追記する、というよくある配備の方法です。変換前に重複したヘッダーを元のファイルで grep してください。1 つのセクション内での重複キーも同じ挙動で、最後の代入が勝ちます。

JSON は INI が頼るコメントを持てません

これは付随的ではなく構造的な損失です。INI はコメントに対応していて多用しますが、RFC 8259 で規定される JSON にはコメントの記法がまったくありません。保存したいと思う変換ツールでも、_comment のようなキーを発明する以外に置き場所がなく、それを読む受け手はいないでしょう。

設定ファイルではこれがしばしば最大の損失です。プールサイズが既定値ではなく 12 である理由を記した注記、例として残されたコメントアウトのブロック、ある顧客向けに調整された値だと示す行——どれも渡りません。変換を置き換えとして扱わず、元の INI ファイルを JSON の隣でバージョン管理に残してください。

手に入れた JSON をどう使うか

出力はスペース 2 つのインデントを持つ普通の JSON なので、jq、Node、Python、あらゆる JSON Schema バリデーターが問題なく読めます。セクションはオブジェクトのパスになります。jq なら .database.host です。そこにスキーマを重ねて、ポートが数値であること、ホストが文字列であることを主張できます。INI ファイルには何も検証できなかったのに対し、これが実際の利得です。

このサイズのファイルの変換は瞬時で、すべてブラウザーの中で完結します。無料枠の上限は 100 MB で、どんな設定ファイルもそこには届きません。実務上の制約はサイズではなく確認です。JSON がすべてから信頼されるファイルになる前に、一度、出力の中の数値を読んでおいてください。

INI を JSON に変換する手順

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

INI と JSON——何が変わるか

INIとJSONの比較
INIJSON
正式名称INI 設定ファイルJavaScript Object Notation
拡張子.ini, .cfg, .conf.json
メディアタイプtext/plainapplication/json
最初の公開19852001
仕様RFC 8259
ライセンスオープン標準オープン標準
現在の位置づけ旧式、ただし今もどこでも読める現行
ブラウザで開けるか対応なしすべてのブラウザ
代わりに検討される形式TOML, YAMLXML, YAML, NDJSON

失われるもの

コメントは引き継がれません。INI ではファイルに説明を書き添えられますが、JSON にはコメントの構文そのものがないので、説明の行はすべて落ちます。そして困るのは、まさにコメントが書かれるようなファイル——誰かが引き継ぐ設定ファイルです。

結果を開く

JSON は今のブラウザーならどれでも開けます。INI はそこまでも届きません。ファイルがウェブページや申込フォームへ向かうのであれば、たいていはそれがこの変換の理由のすべてです。

INI は 1985 年のもので、今ではほとんど使われていません。JSON は今のプログラムが書き出す形式なので、この変換は「読める状態を保つ」という話でもあります。

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

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

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

JSON は 2001 年から使われています。規定は RFC 8259 です。Visual Studio Code、jq、Postmanがこの形式を読めます。

INI は 1985 年、JSON は 2001 年に登場しました。人に渡すならたいてい古いほうが安全で、新しいほうは同じ仕事をより少ないバイト数で片づけます。

INI から JSON:よくある質問

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

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

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

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

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

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

INI から JSON にすると、コメントは残りますか。

コメントは引き継がれません。INI ではファイルに説明を書き添えられますが、JSON にはコメントの構文そのものがないので、説明の行はすべて落ちます。そして困るのは、まさにコメントが書かれるようなファイル——誰かが引き継ぐ設定ファイルです。

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