JSON vs YAML:完全比較
JSONとYAMLの比較。構文、パフォーマンス、使用例。あなたのプロジェクトに最適な形式を選択。
Big JSON Team
• Technical WriterExpert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.
# 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:- ブラケット、引用符が必要
- 機械向け
- インデントベース
- 引用符オプション(多くの場合)
- 人間向け
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
- 配列
- オブジェクト
JSONのすべて + 追加:
- 日付/時刻
- 複数行文字列
- 参照/アンカー
# 日付
date: 2026-01-16
# 複数行(リテラル)
description: |
これは
複数行の
テキストです
# 複数行(折りたたみ)
text: >
これは長いテキスト
で改行は
スペースになります
# アンカーと参照
defaults: &defaults
timeout: 30
retry: 3
service1:
<<: defaults
name: Service1
service2:
<<: defaults
name: Service2
4. 複雑性
JSON:- ✅ シンプル
- ✅ 学習曲線が緩やか
- ✅ 明確な仕様
- ⚠️ 複雑
- ⚠️ 学習曲線が急
- ⚠️ 仕様が大きい
- ⚠️ インデント敏感
パフォーマンス
パース速度
ベンチマーク(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 (組み込み)
- すべてのモダンなブラウザ
- すべての主要なプログラミング言語
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
適材適所で使い分けましょう!