最終更新: 2026年4月
TOML フォーマットとは?
TOML(Tom's Obvious Minimal Language)は、Tom Preston-Werner が 2013 年に作成した設定ファイル形式です。ハッシュテーブルに直接マッピングされ、すべての値に明示的な型付けを使用します。TOML フォーマッターは、生の TOML や書き方が不統一な TOML を受け取り、均一なスペーシング・適切なインデント・正規化されたキーの順序で再シリアライズします。その結果、プロジェクト全体で同じ規約に従ったファイルが生成され、差分でのコンフィグ変更のレビューが容易になります。
2021 年 1 月に確定した TOML v1.0.0 仕様は、準拠するパーサーであれば同じ入力から同一のデータ構造を生成できるほど厳格な文法を定義しています。フォーマットは TOML ファイルのセマンティックな内容を変えません。変わるのは空白・キーのグルーピング・クォートスタイルのみです。つまり、アプリケーションの動作が壊れる心配をせずに TOML ファイルを自由にフォーマットできます。
JSON とは異なり、TOML はコメント・ネイティブの日付と時刻の型・複数の文字列形式(基本文字列・リテラル文字列・複数行文字列)をサポートしています。優れたフォーマッターはコメントを保持し、インラインテーブルと標準テーブルヘッダーの区別を尊重します。また、テーブルの配列も正しく処理し、セクションのグルーピングを維持することで、人間にとっても TOML を読み込むパーサーにとっても読みやすいファイルを保ちます。
title="My App" version="1.0.0" debug=false [database] host="localhost" port=5432 name="mydb" [database.pool] max_connections=25 timeout=30 [[servers]] name="web" host="web.example.com" [[servers]] name="api" host="api.example.com"
title = "My App" version = "1.0.0" debug = false [database] host = "localhost" port = 5432 name = "mydb" [database.pool] max_connections = 25 timeout = 30 [[servers]] name = "web" host = "web.example.com" [[servers]] name = "api" host = "api.example.com"
TOML フォーマッターを使う理由
設定ファイルは、チームメンバーが長期間にわたって編集するにつれてスタイルの乱れが蓄積します。タブとスペースが混在し、一部のキーが不必要にクォートされ、テーブルセクションの視覚的なグルーピングが失われていきます。TOML フォーマッターはこれらをすべて一括で正規化します。
TOML フォーマッターの使用例
TOML 構文リファレンス
TOML は少数の構造要素で構成されています。以下の表は TOML v1.0.0 仕様で定義されているすべての構造要素を示しています。フォーマッターはこれらすべてに対して一貫したスペーシングとグルーピングを適用します。
| 構文 | 名前 | 備考 |
|---|---|---|
| key = "value" | Basic key-value pair | Keys are bare or quoted; values are typed |
| [table] | Standard table | Creates a named section (hash table) |
| [a.b.c] | Dotted table | Shorthand for nested tables |
| [[array]] | Array of tables | Each [[name]] block appends to an array |
| key = """...\n""" | Multi-line basic string | Allows newlines, escapes processed |
| key = '''...\n''' | Multi-line literal string | Allows newlines, no escape processing |
| # comment | Comment | Extends to end of line; not in JSON output |
| {inline = true} | Inline table | Single-line table, no newlines allowed |
TOML vs JSON vs YAML
TOML・JSON・YAML はいずれも重複する問題を解決しますが、それぞれ異なるトレードオフを持っています。
| 機能 | TOML | JSON | YAML |
|---|---|---|---|
| コメント | # 行コメント | 非対応 | # 行コメント |
| 型付き値 | 文字列・整数・浮動小数点・真偽値・日時 | 文字列・数値・真偽値・null | 推論(エラーが起きやすい) |
| ネスト | [table] ヘッダー | 波括弧 | インデントベース |
| 仕様の厳格さ | 厳格(解析結果は一意) | 厳格(RFC 8259) | 緩やか(複数の有効な解析が存在) |
| 日付・時刻のサポート | 4 種類のネイティブ型 | なし(文字列で代替) | 暗黙的(不安定) |
| 末尾カンマ | 不可 | 不可 | N/A(カンマなし) |
コード例
以下の例は、各言語とツールで TOML をプログラム的にフォーマットする方法を示しています。それぞれファイルを読み込み、解析し、整形されたバージョンを出力します。
import { parse, stringify } from '@iarna/toml'
import fs from 'fs'
const raw = fs.readFileSync('config.toml', 'utf-8')
const doc = parse(raw)
const formatted = stringify(doc)
// stringify() outputs canonical TOML with consistent spacing
fs.writeFileSync('config.toml', formatted)
// Quick one-liner with npx:
// npx taplo fmt config.tomlimport tomllib # Python 3.11+ (read-only)
import tomli_w # pip install tomli-w (write)
# Parse and re-serialize to format
with open("config.toml", "rb") as f:
data = tomllib.load(f)
formatted = tomli_w.dumps(data)
# tomli_w produces sorted keys, consistent quoting, and
# proper whitespace around = signs
print(formatted)
# CLI alternative: taplo fmt config.tomlpackage main
import (
"fmt"
"os"
"github.com/BurntSushi/toml"
"bytes"
)
func main() {
var data map[string]interface{}
_, err := toml.DecodeFile("config.toml", &data)
if err != nil {
fmt.Fprintln(os.Stderr, err) // parse error with line number
os.Exit(1)
}
var buf bytes.Buffer
enc := toml.NewEncoder(&buf)
enc.Indent = " "
enc.Encode(data) // re-serialized with consistent formatting
fmt.Print(buf.String())
}# Install taplo — the standard TOML toolkit cargo install taplo-cli # or: npm install -g @taplo/cli # Format a single file in place taplo fmt config.toml # Format all .toml files in a project taplo fmt # Check formatting without modifying (CI-friendly) taplo fmt --check # Validate TOML syntax without formatting taplo lint config.toml