← ブログに戻る

JSON vs YAML:完全比較

JSONとYAMLの比較。構文、パフォーマンス、使用例。あなたのプロジェクトに最適な形式を選択。

Big JSON Team13 分で読めますcomparison
B

Big JSON Team

Technical Writer

Expert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.

13 分読む

# JSON vs YAML:完全比較

JSONとYAMLの違いを理解し、プロジェクトに最適な形式を選択しましょう。

概要

JSON (JavaScript Object Notation)

  • 📅 誕生: 2001年
  • 👤 作成者: Douglas Crockford
  • 🎯 目的: データ交換
  • 📝 拡張子: .json

YAML (YAML Ain't Markup Language)

  • 📅 誕生: 2001年
  • 👥 作成者: Clark Evans, Ingy döt Net, Oren Ben-Kiki
  • 🎯 目的: 人間が読みやすい設定
  • 📝 拡張子: .yaml, .yml

構文比較

基本的なオブジェクト

JSON:
{

"name": "田中太郎",

"age": 30,

"city": "東京"

}

YAML:
name: 田中太郎

age: 30

city: 東京

ネストされた構造

JSON:
{

"user": {

"name": "田中太郎",

"address": {

"city": "東京",

"zip": "100-0001"

}

}

}

YAML:
user:

name: 田中太郎

address:

city: 東京

zip: 100-0001

配列

JSON:
{

"colors": ["赤", "青", "緑"],

"users": [

{"name": "太郎", "age": 30},

{"name": "花子", "age": 25}

]

}

YAML:
colors:

- 赤

- 青

- 緑

users:

- name: 太郎

age: 30

- name: 花子

age: 25

または(インライン):

colors: [赤, 青, 緑]

users:

- {name: 太郎, age: 30}

- {name: 花子, age: 25}

主な違い

1. 可読性

JSON:
  • ブラケット、引用符が必要
  • 機械向け

YAML:
  • インデントベース
  • 引用符オプション(多くの場合)
  • 人間向け

例(設定ファイル):

JSON (やや読みにくい):

{

"database": {

"host": "localhost",

"port": 5432,

"credentials": {

"username": "admin",

"password": "secret"

}

}

}

YAML (読みやすい):

database:

host: localhost

port: 5432

credentials:

username: admin

password: secret

2. コメント

JSON:

❌ コメント非サポート

{

"name": "太郎"

}

YAML:

✅ コメントサポート

# これはコメント

name: 太郎 # インラインコメント

3. データ型

JSON:
  • 文字列
  • 数値
  • boolean (true/false)
  • null
  • 配列
  • オブジェクト

YAML:

JSONのすべて + 追加:

  • 日付/時刻
  • 複数行文字列
  • 参照/アンカー

YAML例:
# 日付

date: 2026-01-16

# 複数行(リテラル)

description: |

これは

複数行の

テキストです

# 複数行(折りたたみ)

text: >

これは長いテキスト

で改行は

スペースになります

# アンカーと参照

defaults: &defaults

timeout: 30

retry: 3

service1:

<<: defaults

name: Service1

service2:

<<: defaults

name: Service2

4. 複雑性

JSON:
  • ✅ シンプル
  • ✅ 学習曲線が緩やか
  • ✅ 明確な仕様

YAML:
  • ⚠️ 複雑
  • ⚠️ 学習曲線が急
  • ⚠️ 仕様が大きい
  • ⚠️ インデント敏感

パフォーマンス

パース速度

ベンチマーク(Python):
import json

import yaml

import time

data = {...} # 大きなデータ

# JSON

start = time.time()

for _ in range(1000):

json.loads(json.dumps(data))

json_time = time.time() - start

# YAML

start = time.time()

for _ in range(1000):

yaml.safe_load(yaml.dump(data))

yaml_time = time.time() - start

print(f"JSON: {json_time:.2f}s")

print(f"YAML: {yaml_time:.2f}s")

# JSON: 0.15s

# YAML: 3.50s (約23倍遅い)

結論: JSON は YAML より 大幅に高速

ファイルサイズ

同じデータ:

JSON (245バイト):

{"users":[{"name":"田中太郎","age":30,"email":"tanaka@example.com"},{"name":"佐藤花子","age":25,"email":"sato@example.com"}]}

YAML (180バイト):

users:

- name: 田中太郎

age: 30

email: tanaka@example.com

- name: 佐藤花子

age: 25

email: sato@example.com

結論: YAMLは通常やや小さい(フォーマット次第)

使用例

JSONが最適な場合

1. API通信

// APIレスポンス

fetch('https://api.example.com/users')

.then(response => response.json())

.then(data => console.log(data));

2. Webアプリケーション

// ブラウザでネイティブサポート

const data = JSON.parse(jsonString);

3. NoSQLデータベース

// MongoDB

db.collection.insertOne({

name: "田中太郎",

age: 30

});

4. パフォーマンス重視

高速なパースが必要な場合。

YAMLが最適な場合

1. 設定ファイル

Docker Compose:
version: '3.8'

services:

web:

image: nginx:latest

ports:

- "80:80"

db:

image: postgres:13

environment:

POSTGRES_PASSWORD: secret

2. CI/CD

GitHub Actions:
name: CI

on: [push]

jobs:

build:

runs-on: ubuntu-latest

steps:

- uses: actions/checkout@v2

- name: Run tests

run: npm test

3. Kubernetes

apiVersion: v1

kind: Pod

metadata:

name: my-pod

spec:

containers:

- name: nginx

image: nginx:1.14.2

ports:

- containerPort: 80

4. 人間が編集する設定

複雑な設定でコメントが必要な場合。

言語サポート

JSON

ネイティブサポート:
  • JavaScript (組み込み)
  • すべてのモダンなブラウザ
  • すべての主要なプログラミング言語

JavaScript:
JSON.parse(string)

JSON.stringify(object)

Python:
import json

json.loads(string)

json.dumps(object)

YAML

ライブラリが必要: Python:
import yaml

yaml.safe_load(string)

yaml.dump(object)

JavaScript:
const yaml = require('js-yaml');

yaml.load(string);

yaml.dump(object);

Ruby:
require 'yaml'

YAML.load(string)

YAML.dump(object)

セキュリティ

JSON

比較的安全

  • 実行可能コードなし
  • 単純なデータ構造

YAML

⚠️ セキュリティリスクあり

危険な例:
# Pythonでのコード実行(旧バージョン)

!!python/object/apply:os.system

args: ['ls -la']

対策:
# 安全なローダーを使用

yaml.safe_load(string) # 推奨

# 危険(使用禁止)

yaml.load(string) # 任意のPythonオブジェクト

相互変換

JSONからYAML

Python:
import json

import yaml

with open('data.json', 'r') as f:

data = json.load(f)

with open('data.yaml', 'w') as f:

yaml.dump(data, f, default_flow_style=False)

Node.js:
const fs = require('fs');

const yaml = require('js-yaml');

const json = JSON.parse(fs.readFileSync('data.json', 'utf8'));

const yamlStr = yaml.dump(json);

fs.writeFileSync('data.yaml', yamlStr);

YAMLからJSON

Python:
import json

import yaml

with open('data.yaml', 'r') as f:

data = yaml.safe_load(f)

with open('data.json', 'w') as f:

json.dump(data, f, indent=2)

実世界での使用

JSONを使用

  • REST API - ほぼすべて
  • MongoDB - ドキュメントストレージ
  • package.json - NPMパッケージ
  • tsconfig.json - TypeScript設定
  • Webアプリ - データ交換

YAMLを使用

  • Docker - docker-compose.yml
  • Kubernetes - すべての設定
  • Ansible - プレイブック
  • GitHub Actions - ワークフロー
  • CircleCI - .circleci/config.yml
  • OpenAPI - API仕様

長所と短所

JSON

長所:
  • ✅ 高速パース
  • ✅ シンプル
  • ✅ 広くサポート
  • ✅ ブラウザネイティブ
  • ✅ 厳密な仕様

短所:
  • ❌ コメントなし
  • ❌ 冗長(ブラケット、引用符)
  • ❌ 人間が編集しにくい
  • ❌ 複数行文字列が難しい

YAML

長所:
  • ✅ 読みやすい
  • ✅ コメントサポート
  • ✅ 複数行文字列が簡単
  • ✅ 参照/アンカー
  • ✅ 人間が編集しやすい

短所:
  • ❌ パースが遅い
  • ❌ 複雑
  • ❌ インデント敏感
  • ❌ セキュリティリスク
  • ❌ デバッグが難しい

選択ガイド

JSONを選択する場合

  • 🚀 パフォーマンスが重要
  • 🌐 API通信
  • 💻 ブラウザ使用
  • 🔄 機械間通信
  • 📊 データベースストレージ

YAMLを選択する場合

  • 📝 設定ファイル
  • 👥 人間が頻繁に編集
  • 💬 コメントが必要
  • 🔧 DevOps/インフラ
  • 📖 ドキュメントとして読める必要がある

ベストプラクティス

JSON

{

"version": "1.0",

"config": {

"timeout": 30,

"retries": 3

}

}

  • インデント2または4スペース
  • 一貫したフォーマット
  • 検証ツール使用

YAML

# アプリケーション設定

version: "1.0"

config:

# タイムアウト(秒)

timeout: 30

# リトライ回数

retries: 3

  • インデント2スペース(一貫性)
  • コメントを活用
  • YAML linter使用
  • 引用符は必要な時のみ

まとめ

クイック比較表

| 特徴 | JSON | YAML |

|------|------|------|

| パース速度 | ⭐⭐⭐⭐⭐ | ⭐⭐ |

| 可読性 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |

| シンプルさ | ⭐⭐⭐⭐⭐ | ⭐⭐ |

| コメント | ❌ | ✅ |

| ブラウザサポート | ✅ | ❌ |

| 主な用途 | API/データ | 設定 |

最終推奨

デフォルトでJSON、設定ファイルはYAML
  • データ交換 → JSON
  • 設定ファイル → YAML
  • APIレスポンス → JSON
  • CI/CD → YAML
  • NoSQL → JSON
  • Kubernetes → YAML

適材適所で使い分けましょう!

Share:

関連記事

Read in English