JSON vs CSV:いつどちらを使うべきか
JSONとCSVフォーマットの完全な比較。実用的な例とパフォーマンスベンチマークを使用して、データストレージ、API設計、データ交換のニーズに応じてJSONまたはCSVを選択するタイミングを学びます。
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 CSV:いつどちらを使うべきか
JSONとCSVはどちらも遍在するデータフォーマットですが、間違った選択をすると、何時間もの開発時間を失い、メンテナンスの悪夢を引き起こす可能性があります。この包括的なガイドでは、実際の例を使用してJSONとCSVのどちらをいつ使用するかを正確に示します。
---
クイック比較
| 機能 | JSON | CSV |
|---------|------|-----|
| 人間が読める | ✅ はい | ✅ はい |
| 機械解析可能 | ✅ 簡単 | ✅ 簡単 |
| 階層データ | ✅ ネイティブ | ❌ 難しい |
| ファイルサイズ | 大きい | ✅ 小さい |
| スキーマサポート | ✅ 柔軟 | ❌ なし |
| データ型 | ✅ 複数 | ❌ テキストのみ |
| Excel互換 | ⚠️ 変換が必要 | ✅ 直接 |
| API標準 | ✅ はい | ❌ まれ |
要約:- JSONを使用 - API、設定、階層データ用
- CSVを使用 - スプレッドシート、データエクスポート、表形式データ用
---
フォーマットの理解
JSONとは?
JSON(JavaScript Object Notation)は、キーと値のペアで構造化データを表現する軽量データフォーマットです。
例:{
"users": [
{
"id": 1,
"name": "Alice Johnson",
"email": "alice@example.com",
"roles": ["admin", "editor"],
"active": true,
"metadata": {
"lastLogin": "2026-02-15T10:30:00Z",
"loginCount": 247
}
},
{
"id": 2,
"name": "Bob Smith",
"email": "bob@example.com",
"roles": ["viewer"],
"active": false,
"metadata": {
"lastLogin": "2026-01-10T14:22:00Z",
"loginCount": 12
}
}
]
}
特徴:
- ネストされたオブジェクトと配列をサポート
- 複数のデータ型(文字列、数値、ブール値、null、オブジェクト、配列)
- 自己記述型の構造
- Web APIの標準
CSVとは?
CSV(Comma-Separated Values)は、各行が行を表し、カンマが列を区切る表形式データのプレーンテキストフォーマットです。
例(同じデータ):id,name,email,roles,active,lastLogin,loginCount
1,Alice Johnson,alice@example.com,"admin,editor",true,2026-02-15T10:30:00Z,247
2,Bob Smith,bob@example.com,viewer,false,2026-01-10T14:22:00Z,12
特徴:
- シンプルな行と列の構造
- すべての値がテキストとして扱われる
- ネストされたデータをサポートしない
- スプレッドシートとの互換性が高い
---
JSONを使用すべき場合
✅ JSONを使用する場合:
1. Web APIの構築
JSONが勝る理由:- REST APIの標準フォーマット
- JavaScriptネイティブサポート
- すべての言語で解析が簡単
- 複雑なデータ構造をサポート
{
"status": "success",
"data": {
"user": {
"id": 123,
"profile": {
"firstName": "Alice",
"lastName": "Johnson",
"avatar": "https://example.com/avatar.jpg"
},
"preferences": {
"theme": "dark",
"notifications": {
"email": true,
"push": false,
"sms": true
}
}
}
},
"meta": {
"timestamp": "2026-02-15T10:30:00Z",
"version": "2.0"
}
}
CSV代替: この構造をきれいに表現することはほぼ不可能。
2. 設定ファイル
JSON設定の例:{
"app": {
"name": "MyApp",
"version": "3.2.1",
"environment": "production"
},
"database": {
"host": "db.example.com",
"port": 5432,
"credentials": {
"username": "admin",
"passwordEnv": "DB_PASSWORD"
},
"pool": {
"min": 2,
"max": 10
}
},
"features": {
"authentication": true,
"rateLimit": {
"enabled": true,
"maxRequests": 100,
"window": "15m"
}
}
}
CSVではない理由: 設定ファイルには階層と異なるデータ型が必要。
3. 階層/ネストされたデータ
製品カタログの例:{
"categories": [
{
"id": "electronics",
"name": "Electronics",
"subcategories": [
{
"id": "laptops",
"name": "Laptops",
"products": [
{
"sku": "LAP-001",
"name": "MacBook Pro",
"specs": {
"cpu": "M3 Pro",
"ram": "16GB",
"storage": "512GB"
},
"price": 1999.99,
"inStock": true,
"tags": ["premium", "professional", "portable"]
}
]
}
]
}
]
}
CSVの制限: これを平坦化すると階層関係が失われる。
4. 混合データ型
注文サマリー:{
"orderId": "ORD-789456",
"customer": {
"id": 12345,
"name": "Alice Johnson",
"vip": true
},
"items": [
{
"productId": 101,
"quantity": 2,
"price": 29.99,
"discounted": false
},
{
"productId": 203,
"quantity": 1,
"price": 149.99,
"discounted": true
}
],
"totals": {
"subtotal": 209.97,
"tax": 18.90,
"shipping": 0.00,
"total": 228.87
},
"shipped": false,
"estimatedDelivery": "2026-02-20"
}
利点: 数値は数値、ブール値はブール値、曖昧さなし。
5. リアルタイムデータストリーム
WebSocket更新:{
"type": "PRICE_UPDATE",
"symbol": "AAPL",
"price": 182.45,
"change": +2.31,
"timestamp": 1708000000,
"volume": 45723891
}
JSONの理由: インクリメンタル解析が簡単、さまざまなメッセージタイプをサポート。
---
CSVを使用すべき場合
✅ CSVを使用する場合:
1. スプレッドシートのインポート/エクスポート
CSVが勝る理由:- Excel、Google Sheets、Numbersで直接開ける
- 変換不要
- 数式を保持(一部の場合)
- ユニバーサル互換性
Date,Product,Quantity,Price,Total,Region
2026-02-01,Widget A,50,12.99,649.50,North
2026-02-01,Widget B,30,19.99,599.70,South
2026-02-02,Widget A,45,12.99,584.55,East
2026-02-02,Widget C,20,34.99,699.80,West
使用法:
2. 大規模な表形式データセット
パフォーマンス比較: データセット: 100万行 × 10列| フォーマット | ファイルサイズ | 解析時間 | メモリ |
|--------|-----------|------------|--------|
| CSV | 85 MB | 2.3秒 | 120 MB |
| JSON | 210 MB | 5.8秒 | 340 MB |
CSVの例:userId,timestamp,action,page,duration
1001,2026-02-15 10:00:00,view,/home,45
1002,2026-02-15 10:00:05,click,/products,120
1003,2026-02-15 10:00:08,view,/about,30
利点:
- ファイルサイズが小さい
- 解析が速い(ネストされた構造がない)
- メモリ使用量が少ない
- ストリーム処理に適している
3. データ移行
データベースエクスポートの例:customer_id,first_name,last_name,email,join_date,total_orders
1,John,Doe,john@example.com,2025-01-15,23
2,Jane,Smith,jane@example.com,2025-03-22,17
3,Bob,Johnson,bob@example.com,2025-06-10,31
CSVの理由:
- ほとんどのデータベースがCSVインポートをネイティブサポート
COPYまたはLOAD DATAコマンドがCSVに最適化されている- カスタムパーサーが不要
- バッチ処理が簡単
COPY customers(customer_id, first_name, last_name, email, join_date, total_orders)
FROM '/path/to/customers.csv'
DELIMITER ','
CSV HEADER;
4. Pandas/Rでのデータ分析
Python - Pandas:import pandas as pd
# CSVの方が速く、メモリ使用量が少ない
df = pd.read_csv('sales_data.csv')
# 即座のデータ分析
print(df.describe())
print(df.groupby('Region')['Total'].sum())
R - データフレーム:
# ネイティブCSVサポート
data <- read.csv("sales_data.csv")
# 統計分析
summary(data)
aggregate(Total ~ Region, data, sum)
5. シンプルなデータ共有
メール添付:- CSVはどのコンピュータでも開ける(Excelなしでも)
- 特別なソフトウェア不要
- テキストエディタで表示可能
- ファイルサイズが小さい
Name,Email,Phone,Company
Alice Johnson,alice@example.com,555-0101,Acme Corp
Bob Smith,bob@example.com,555-0102,TechStart
Carol White,carol@example.com,555-0103,DataCo
---
実際のシナリオ
シナリオ1:Eコマース製品カタログ
要件:- 10,000製品
- ネストされたカテゴリ
- 製品ごとに複数の画像
- 可変属性(サイズ、色など)
- リアルタイム在庫更新
- 階層的なカテゴリ構造
- 製品タイプごとに柔軟な属性
- Web/モバイルアプリ用のAPIに適している
- 配列をサポート(画像、バリアント)
{
"sku": "SHIRT-001",
"name": "コットンTシャツ",
"category": ["衣料品", "メンズ", "Tシャツ"],
"images": [
"https://cdn.example.com/shirt-001-front.jpg",
"https://cdn.example.com/shirt-001-back.jpg"
],
"variants": [
{ "size": "S", "color": "Blue", "sku": "SHIRT-001-S-BLU", "inStock": 15 },
{ "size": "M", "color": "Blue", "sku": "SHIRT-001-M-BLU", "inStock": 23 },
{ "size": "L", "color": "Red", "sku": "SHIRT-001-L-RED", "inStock": 8 }
],
"price": {
"base": 29.99,
"sale": 24.99,
"currency": "USD"
}
}
シナリオ2:月次売上レポート
要件:- 財務チーム用のデータエクスポート
- 5列:日付、製品、数量、価格、合計
- 30,000行
- Excelでピボットテーブルに使用
- 平坦な表形式データ
- Excelが目的地
- ネストされた構造が不要
- 財務チームはCSVを期待
Date,Product,Quantity,Price,Total
2026-02-01,Widget A,50,12.99,649.50
2026-02-01,Widget B,30,19.99,599.70
2026-02-02,Widget A,45,12.99,584.55
シナリオ3:設定管理
要件:- アプリケーション設定
- データベース認証情報
- 機能フラグ
- 環境固有の値
- 設定の論理的なグループ化
- 異なるデータ型(ブール値、数値、文字列)
- コメントが必要(JSON5またはYAMLを使用)
- バージョン管理に適している
{
"database": {
"host": "localhost",
"port": 5432,
"ssl": true
},
"features": {
"newUI": true,
"betaAccess": false
},
"limits": {
"maxUsers": 1000,
"rateLimit": 100
}
}
シナリオ4:センサーデータ収集
要件:- IoTセンサーが読み取り値を送信
- 1日あたり100,000の読み取り
- シンプルな構造:タイムスタンプ、センサーID、値
- 分析用に保存
- シンプルで平坦な構造
- 大量(CSVの方が効率的)
- pandas/Rで分析
- ストレージコストが低い
timestamp,sensorId,temperature,humidity
2026-02-15 10:00:00,SENSOR-001,22.5,45.2
2026-02-15 10:00:30,SENSOR-002,23.1,46.8
2026-02-15 10:01:00,SENSOR-001,22.7,45.5
シナリオ5:ソーシャルメディアAPI
要件:- コメント付きのユーザー投稿
- いいね、シェア、メタデータ
- ネストされたユーザープロフィール
- リアルタイム更新
- Web APIの標準
- ネストされたデータ(投稿 → コメント → 返信)
- 投稿タイプごとに可変フィールド
- クライアント側解析(JavaScript)
{
"post": {
"id": "post_789",
"author": {
"id": "user_123",
"name": "Alice",
"avatar": "https://cdn.example.com/avatars/123.jpg",
"verified": true
},
"content": "新製品をリリースしました!🚀",
"media": [
{ "type": "image", "url": "https://cdn.example.com/img/abc.jpg" }
],
"engagement": {
"likes": 342,
"shares": 45,
"comments": 28
},
"comments": [
{
"id": "comment_456",
"author": { "id": "user_789", "name": "Bob" },
"text": "おめでとうございます!",
"timestamp": "2026-02-15T10:30:00Z"
}
],
"timestamp": "2026-02-15T09:00:00Z"
}
}
---
フォーマット間の変換
JSONからCSVへ
課題: 階層データの平坦化 例 - ユーザーデータ: JSON:{
"users": [
{
"id": 1,
"name": "Alice",
"email": "alice@example.com",
"address": {
"city": "New York",
"state": "NY"
}
}
]
}
平坦化されたCSV:
id,name,email,address.city,address.state
1,Alice,alice@example.com,New York,NY
JavaScript変換:
function jsonToCsv(jsonArray) {
const flatten = (obj, prefix = '') => {
return Object.keys(obj).reduce((acc, key) => {
const newKey = prefix ? ${prefix}.${key} : key;
if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) {
Object.assign(acc, flatten(obj[key], newKey));
} else {
acc[newKey] = obj[key];
}
return acc;
}, {});
};
const flattened = jsonArray.map(flatten);
const headers = Object.keys(flattened[0]);
const csv = [
headers.join(','),
...flattened.map(row => headers.map(h => JSON.stringify(row[h] ?? '')).join(','))
].join('\n');
return csv;
}
// 使用法
const users = [
{ id: 1, name: "Alice", email: "alice@example.com", address: { city: "NYC", state: "NY" } }
];
console.log(jsonToCsv(users));
オンラインツール: BigJSON to CSVコンバーターを使用
CSVからJSONへ
Pythonの例:import csv
import json
def csv_to_json(csv_file, json_file):
data = []
with open(csv_file, 'r') as f:
reader = csv.DictReader(f)
for row in reader:
data.append(row)
with open(json_file, 'w') as f:
json.dump(data, f, indent=2)
# 使用法
csv_to_json('users.csv', 'users.json')
JavaScript:
function csvToJson(csvText) {;const lines = csvText.trim().split('\n');
const headers = lines[0].split(',');
return lines.slice(1).map(line => {
const values = line.split(',');
return headers.reduce((obj, header, index) => {
obj[header.trim()] = values[index]?.trim();
return obj;
}, {});
});
}
// 使用法
const csv =
id,name,email1,Alice,alice@example.com
2,Bob,bob@example.com
console.log(JSON.stringify(csvToJson(csv), null, 2));
---
パフォーマンスの考慮事項
ファイルサイズの比較
データセット: 10,000ユーザーレコード| フォーマット | サイズ | 圧縮(gzip) |
|--------|------|-------------------|
| JSON | 2.1 MB | 450 KB |
| CSV | 890 KB | 280 KB |
結論: 表形式データの場合、CSVの方がスペース効率が良い。解析速度
ベンチマーク: 100,000行| 言語 | JSON | CSV |
|----------|------|-----|
| JavaScript | 850ms | 320ms |
| Python | 1.2秒 | 450ms |
| Java | 420ms | 180ms |
結論: CSVの解析は、構造がシンプルなため一般的に高速。メモリ使用量
JSON: 以下の理由により高いメモリ:- オブジェクトのオーバーヘッド
- 文字列キーが繰り返し格納される
- ネストされた構造
- シンプルな配列
- キーストレージなし(ヘッダーは参照)
- ストリーム処理が可能
---
ベストプラクティス
JSONの場合:
✅ APIに使用 - 標準フォーマット、よくサポートされている
✅ スキーマで検証 - JSONスキーマを使用して構造を検証
✅ 人間用にプリティプリント - 読みやすくするためにインデント
✅ 本番用に最小化 - サイズを減らすために空白を削除
✅ 大きなファイルは慎重に処理 - ストリーミングパーサーを使用
CSVの場合:
✅ 常にヘッダーを含める - 最初の行は列名であるべき
✅ カンマを含むフィールドを引用符で囲む - "Value, with comma"
✅ 引用符をエスケープ - 二重引用符を使用:"He said ""hello"""
✅ 一貫したエンコーディングを使用 - UTF-8が推奨
✅ Excelでテスト - 互換性を確保
---
ハイブリッドアプローチ
JSONフィールド付きCSV
ユースケース: 主に表形式だが、一部の複雑なフィールドid,name,email,preferences
1,Alice,alice@example.com,"{""theme"":""dark"",""language"":""en""}"
2,Bob,bob@example.com,"{""theme"":""light"",""language"":""es""}"
長所: シンプルさと柔軟性のバランス
短所: CSV内でJSONを解析する必要がある
JSON Lines(JSONL)
ユースケース: 大規模データセットのストリーミング{"id":1,"name":"Alice","email":"alice@example.com"}
{"id":2,"name":"Bob","email":"bob@example.com"}
{"id":3,"name":"Carol","email":"carol@example.com"}
利点:
- 1行に1つのJSONオブジェクト
- ストリーム処理に適している
- 追加専用の更新
- 大規模データセットを処理
---
決定ツリー
ネストされた/階層データを表現する必要がありますか?
├─ はい → JSONを使用
└─ いいえ → 続行
目的地はスプレッドシート(Excel/Sheets)ですか?
├─ はい → CSVを使用
└─ いいえ → 続行
これはWeb API用ですか?
├─ はい → JSONを使用
└─ いいえ → 続行
複数のデータ型(数値、ブール値)が必要ですか?
├─ はい → JSONを使用
└─ いいえ → 続行
シンプルな表形式データでファイルサイズ/パフォーマンスが重要ですか?
├─ はい → CSVを使用
└─ いいえ → JSONを使用(より柔軟)
---
結論
JSONを選択する場合:
- 🌐 Web APIの構築
- 🎯 階層構造のデータ
- 🔧 設定ファイル
- 📱 モバイル/Webアプリケーション
- 🔄 リアルタイムデータ交換
CSVを選択する場合:
- 📊 スプレッドシートのインポート/エクスポート
- 📈 大規模な表形式データセット
- 💾 シンプルなデータ移行
- 🔬 データ分析(pandas/R)
- 📧 メール添付
関連ツール
- JSONからCSVへのコンバーター - JSONをオンラインでCSVに変換
- CSVからJSONツール - 逆変換
- JSONフォーマッター - JSONのフォーマットと検証
- JSONバリデーター - JSON構文をチェック
---
関連記事
---
最終更新日:2026年2月15日