TOMLからJSONへ

RustのCargo.toml、Pythonのpyproject.toml、Hugoのconfig.tomlなど、現代の設定ファイルの世界ではTOMLが至る所で使われています。一方で、JSONしか読めないツールもまだ数多くあります。ここにTOMLを貼り付けると、整形済みのJSONが返ります。[テーブル]セクションはネストしたオブジェクトに、[[テーブルの配列]]ブロックはオブジェクトの配列になり、日付は書かれたままの文字列として通過します。このパーサーはTOMLの日常的なコア部分をカバーしています。実際の制限(複数行の値、インラインテーブル、ドット付きキー)は下で包み隠さず説明します。

変換の仕組み

  1. 1

    TOMLを貼り付ける

    入力欄にテキストを入れて「JSONに変換」を押します。行全体の#コメントは自動的にスキップされます。

  2. 2

    テーブルはオブジェクトになる

    `[server.database]`というヘッダーは、ドット区切りの名前ごとに1階層ずつネストしたJSONオブジェクトになります。

  3. 3

    テーブルの配列は配列になる

    `[[users]]`ブロックは、ブロックごとに1つのオブジェクトを持つJSON配列を組み立てます。

  4. 4

    スカラー値は型を保つ

    引用符付き文字列、単純な10進の整数と小数、true/falseはネイティブなJSON型になります。日付は書かれたとおりの文字列のままです。

  5. 5

    JSONをコピーする

    結果はスペース4個のインデントで整形され、キーは元の順序のまま、すぐにコピーできます。

型の対応表

TOMLの値 JSONの値 例
文字列(基本・リテラル) 文字列 "hello" → "hello"
整数(単純な10進) 数値 42 → 42
小数(単純な10進) 数値 3.14 → 3.14
真偽値 真偽値 true → true
配列(1行) 配列 [1, 2, 3] → [1, 2, 3]
キーを持つテーブル オブジェクト [server] + port = 8080 → "server": {"port": 8080}
テーブルの配列 オブジェクトの配列 [[users]] + name = "alice" → "users": [{"name": "alice"}]
日時 文字列(書かれたまま) 2026-04-18T10:00:00Z → "2026-04-18T10:00:00Z"

出力は常にスペース4個のインデントで整形されるため、配列とオブジェクトは複数行に展開されます。上の表は読みやすさのために値を1行で示しています。キーの順序はTOMLに書かれたとおりに保たれます。

変換例

title = "My App"

[server]
host = "localhost"
port = 8080

[[users]]
name = "alice"
admin = true

は次のように変換されます。

{
    "title": "My App",
    "server": {
        "host": "localhost",
        "port": 8080
    },
    "users": [
        {
            "name": "alice",
            "admin": true
        }
    ]
}

対応しているTOMLと実際の制限

対応: ドット付きセクション名を含む[テーブル]ヘッダー、[[テーブルの配列]]、1行のkey = valueペア、\n・\t・\"エスケープ付きの基本文字列"..."、リテラル文字列'...'、単純な10進の整数と小数、true/false、1行の配列(ネスト可)、行全体の#コメント、文字列として通過する日付。

非対応の項目と、代わりにどうすべきか:

  • 複数行文字列("""または''')と複数行配列はパースエラーで停止します。先に値を1行にまとめてください。
  • インラインテーブルは展開されません: point = { x = 1, y = 2 }はオブジェクトではなく文字列"{ x = 1, y = 2 }"として出力されます。独立した[point]セクションに書き換えてください。Cargo.tomlの依存関係行serde = { version = "1.0" }が典型例です。
  • ドット付きキーが等号の左にある場合、1つのフラットなキーのままです: server.host = "a"はネストせずにキー"server.host"を生成します。代わりに[server]ヘッダーを使ってください。ヘッダー内のドット付き[section.names]は正しくネストします。
  • 値の後ろのコメントは除去されません: port = 8080 # mainは文字列"8080 # main"になります。コメントは独立した行に置いてください。
  • 単純な10進以外の数値形式は認識されません: 1_000、0xFF、5e2、+99、inf、nanは引用符付き文字列として出てきます。1000、255、500、99と書いてください。
  • 基本文字列内の\uXXXXエスケープはデコードされません。代わりに実際の文字を貼り付けてください。

完全なTOML 1.0ドキュメントには、toml2jsonのようなコマンドライン変換ツールを使うか、Pythonのtomllibで読み込んでからJSONを書き出してください。

便利な使いどころ

  • デバッグ中にTOMLの断片をJSONとして素早く確認する。
  • JSONしか受け付けないリンター、スクリプト、インベントリツールにシンプルな設定値を渡す。
  • 手書きしやすいTOMLのメモからテスト用のJSONフィクスチャを生成する。
  • 小さくフラットな設定ファイルの移行。Hugoのconfig.tomlの多くがこれに当たります。

往復変換に関する注意

  • コメントは決して残りません。JSONにはコメント構文自体がありません。
  • 日付は文字列のままです。後続のコードで日付オブジェクトに再変換する必要があります。
  • 大きな数値: JSONテキスト内では整数は64ビット値として保たれますが、JavaScript側の利用者は2^53を超えると精度を失います。ナノ秒タイムスタンプや数値IDに注意してください。
  • キーの順序はこのコンバーターでは書かれたまま保持されます。他のJSONツールは再出力時にキーを並べ替えることがあります。

逆方向

JSON → TOMLの方が難路です。JSONには、TOMLに存在しないか扱いが異なる構造(深い無名ネスト、null)があるためです。往復変換のシナリオでは、たいていTOML側での手直しが必要になります。

よくある質問

いいえ。JSONにはコメント構文がないため、行全体の#コメントは単にスキップされます。注意点として、値の後ろに置いたコメントは除去されず、port = 8080 # main は文字列 “8080 # main” になります。変換前にコメントを独立した行へ移してください。

いいえ。日常的なコア部分に対応しています。ドット付きセクション名のテーブル、テーブルの配列、1行のkey = valueペア、引用符付き文字列、単純な10進数、真偽値、1行の配列、行全体のコメントです。複数行の文字列と配列、インラインテーブル、ドット付きキー、1_000や0xFFのような数値形式には対応していません。仕様に完全準拠したドキュメントにはtoml2jsonやPythonのtomllibなどのCLIツールをお使いください。

一般的な設定ファイルなら瞬時に変換されます。変換は当社のサーバーで実行されるため、巨大なドキュメントはリクエストサイズの上限に制約されます。数メガバイト級のTOMLにはコマンドライン変換ツールの方が適しています。

はい。このコンバーターはサーバーサイドで動作します。TOMLはHTTPSで当社サーバーへ送られ、そこで変換され、同じレスポンスで戻ります。内容はその後保存されず、匿名の利用回数カウントだけが記録されます。パスワードやAPIキーなどの秘密情報は貼り付けないでください。

関連ツール

このツールは他の言語でも利用できます