DevToolBox無料
ブログ

JSON vs YAML vs TOML:どの設定フォーマットを使うべき?

10分by DevToolBox

JSON、YAML、TOMLはソフトウェア開発で最も人気のある3つの設定フォーマットです。それぞれに異なる強みとトレードオフがあります。このガイドでは、プロジェクトに最適なフォーマットを選ぶための包括的な比較を提供します。

無料ツールで JSON と YAML を即座に変換 →

各フォーマットの概要

JSON(JavaScript Object Notation)

JSONは2000年代初頭にDouglas Crockfordによって導入されました。Web API、package.jsontsconfig.jsonなどのデファクトスタンダードです。

YAML(YAML Ain't Markup Language)

YAMLは2001年に提案され、人間が読みやすいことを目指して設計されました。Docker Compose、Kubernetes、Ansible、CI/CDパイプラインで広く使われています。

TOML(Tom's Obvious Minimal Language)

TOMLは2013年にTom Preston-Wernerによって作られた最小限で曖昧さのない設定フォーマットです。Rust(Cargo.toml)、Python(pyproject.toml)、Hugoの標準です。

構文の比較

同じ設定を3つのフォーマットで表現します:

JSON

{
  "server": {
    "host": "localhost",
    "port": 8080,
    "debug": true
  },
  "database": {
    "host": "db.example.com",
    "port": 5432,
    "name": "myapp",
    "credentials": {
      "username": "admin",
      "password": "secret"
    }
  },
  "features": ["auth", "logging", "cache"],
  "max_connections": 100
}

YAML

# Server configuration
server:
  host: localhost
  port: 8080
  debug: true

# Database settings
database:
  host: db.example.com
  port: 5432
  name: myapp
  credentials:
    username: admin
    password: secret

features:
  - auth
  - logging
  - cache

max_connections: 100

TOML

# Server configuration
max_connections = 100
features = ["auth", "logging", "cache"]

[server]
host = "localhost"
port = 8080
debug = true

[database]
host = "db.example.com"
port = 5432
name = "myapp"

[database.credentials]
username = "admin"
password = "secret"

機能比較

機能JSONYAMLTOML
コメントなしあり(#)あり(#)
データ型string, number, boolean, null, array, objectstring, int, float, bool, null, date, array, map + カスタムタグstring, integer, float, boolean, datetime, array, table
可読性中程度——波括弧と引用符がノイズになる高い——インデントベースのきれいな構文高い——INIライクでセクションが明確
厳密さ非常に厳密——末尾カンマやコメント不可緩い——暗黙的な型推論が予想外の動作を引き起こす厳密——明示的な型、曖昧さ最小限
ツールサポート優秀——全言語でネイティブパーサー対応良好——主要言語すべてにパーサーあり良好——成長中、Rust/Python/Goで強い
複数行文字列なし(\n エスケープシーケンスを使用)あり(| リテラル、> フォールド)あり(トリプルクォート文字列)

各フォーマットの使いどころ

JSON を使う場合...

  • REST APIの構築または利用
  • package.jsontsconfig.jsonでの作業
  • 機械が主に読むデータの保存
  • 最も幅広いツールサポートが必要な場合
  • 異なるプログラミング言語間のデータ交換
// Typical JSON use cases
// package.json
{
  "name": "my-app",
  "version": "1.0.0",
  "scripts": {
    "dev": "next dev",
    "build": "next build"
  }
}

// tsconfig.json
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "ESNext",
    "strict": true
  }
}

YAML を使う場合...

  • Docker ComposeKubernetesマニフェストの作成
  • CI/CDパイプラインの設定
  • AnsibleHelmの使用
  • 設定にコメントが必要な場合
  • 人間の可読性が最優先
# Docker Compose
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html

# GitHub Actions
name: CI
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm test

TOML を使う場合...

  • Rustプロジェクトの設定(Cargo.toml
  • Pythonプロジェクトの設定(pyproject.toml
  • Hugoの使用
  • 暗黙的な型変換のない明確なフォーマットが必要な場合
  • 設定に明確なセクション/グループがある場合
# Cargo.toml (Rust)
[package]
name = "my-app"
version = "0.1.0"
edition = "2021"

[dependencies]
serde = { version = "1.0", features = ["derive"] }
tokio = { version = "1", features = ["full"] }

# pyproject.toml (Python)
[project]
name = "my-package"
version = "1.0.0"
requires-python = ">=3.9"

[tool.ruff]
line-length = 88
target-version = "py39"

よくある落とし穴

YAML:インデントの問題

YAMLはインデントで構造を定義します。タブとスペースの混在やインデントレベルの不一致は、最も一般的なエラーの原因です。

# BAD: mixing tabs and spaces (invisible but breaks YAML)
services:
	web:          # tab character - YAML error!
    image: nginx

# BAD: inconsistent indentation
services:
  web:
      image: nginx   # 4 spaces here
    ports:            # 2 spaces here - error!
      - "80:80"

# GOOD: consistent 2-space indentation
services:
  web:
    image: nginx
    ports:
      - "80:80"

YAML:「ノルウェー問題」

YAML 1.1では、引用符なしのNOyesonoffはブール値として解釈されます。国コード「NO」(ノルウェー)はfalseになります。

# The "Norway Problem" - YAML 1.1
countries:
  - name: Norway
    code: NO          # Parsed as boolean false!
  - name: Sweden
    code: SE          # Parsed as string "SE"
  - name: Finland
    code: FI          # Parsed as string "FI"

# Other surprising boolean values in YAML 1.1:
truthy:  yes          # boolean true
falsy:   no           # boolean false
enabled: on           # boolean true
disabled: off         # boolean false
positive: TRUE        # boolean true
negative: False       # boolean false

# FIX: Always quote values that could be misinterpreted
countries:
  - name: Norway
    code: "NO"        # Now correctly a string
  - name: Sweden
    code: "SE"
settings:
  enabled: "yes"      # Now correctly a string

JSON:末尾カンマ

JSONは末尾カンマを許可しません。最後の要素の後にカンマを追加するとパースエラーになります。

// BAD: trailing comma after last element
{
  "name": "my-app",
  "version": "1.0.0",
  "private": true,    // <-- trailing comma = PARSE ERROR
}

// BAD: trailing comma in array
{
  "colors": [
    "red",
    "green",
    "blue",            // <-- trailing comma = PARSE ERROR
  ]
}

// GOOD: no trailing commas
{
  "name": "my-app",
  "version": "1.0.0",
  "private": true
}

TOML:ネストされたテーブル構文

TOMLでの深いネスト構造は冗長になることがあります。各レベルに独自の[section.subsection]ヘッダーが必要です。

# TOML: deeply nested config can be verbose
[server]
host = "localhost"

[server.ssl]
enabled = true

[server.ssl.certificates]
cert = "/path/to/cert.pem"
key = "/path/to/key.pem"

[server.ssl.certificates.ca]
bundle = "/path/to/ca-bundle.pem"

# The same in YAML is more compact:
# server:
#   host: localhost
#   ssl:
#     enabled: true
#     certificates:
#       cert: /path/to/cert.pem
#       key: /path/to/key.pem
#       ca:
#         bundle: /path/to/ca-bundle.pem

# TOML inline tables can help for shallow nesting:
[server]
host = "localhost"
ssl = { enabled = true, cert = "/path/to/cert.pem" }

変換ツール

フォーマット間の切り替えが必要ですか?無料オンラインコンバーターをご利用ください:

JSON ↔ YAML コンバーター——双方向変換対応

TOML ↔ YAML コンバーター——即座に変換

よくある質問

JSON、YAML、TOMLのうちパースが最も速いのは?

JSONは一般的に最も高速です。シンプルで厳密な文法のため、パーサーが高度に最適化されています。TOMLも明確な構文のため高速です。YAMLは複雑な仕様のため最も遅いです。

JSONでコメントは使えますか?

標準JSON(RFC 8259)はコメントをサポートしていません。JSON5やJSONCが拡張としてコメントをサポートしますが、非標準です。

なぜYAMLは「NO」をfalseとして扱うのですか?

YAML 1.1ではyes/no、on/off、true/falseがブール値として認識されます。「NO」(ノルウェー)はfalseになります。常に引用符で囲んでください。

TOMLはYAMLより設定ファイルに適していますか?

TOMLはシンプルな設定に適しています。YAMLは深いネスト構造に優れています。エコシステムによります。

フォーマット間の変換でデータは失われますか?

一般的なデータ構造では変換は無損失です。YAMLアンカーやコメントなどのフォーマット固有の機能はJSONへの変換時に失われます。

無料ツールで JSON と YAML を即座に変換 →

無料ツールで TOML と YAML を変換 →

𝕏 Twitterin LinkedIn
この記事は役に立ちましたか?

最新情報を受け取る

毎週の開発ヒントと新ツール情報。

スパムなし。いつでも解除可能。

Try These Related Tools

Y{}JSON ↔ YAML ConverterTYTOML ↔ YAML{ }JSON FormatterYMLYAML Validator & Formatter

Related Articles

Cron式の例:5分毎、毎日、毎週、毎月

実用的な例でcron式をマスター。

Docker Compose YAML検証:よくある10の構文エラーと修正方法

Docker Compose YAMLエラーで時間を無駄にしない。よくある10の構文ミスを特定・修正する方法。