← ブログに戻る

JSON vs CSV:いつどちらを使うべきか

JSONとCSVフォーマットの完全な比較。実用的な例とパフォーマンスベンチマークを使用して、データストレージ、API設計、データ交換のニーズに応じてJSONまたはCSVを選択するタイミングを学びます。

Big JSON Team13 分で読めますbasics
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 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ネイティブサポート
  • すべての言語で解析が簡単
  • 複雑なデータ構造をサポート

例 - ユーザーAPIレスポンス:
{

"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

使用法:
  • CSVをダウンロード
  • Excelで開く
  • すぐにピボットテーブル、グラフを作成
  • 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に最適化されている
    • カスタムパーサーが不要
    • バッチ処理が簡単

    例 - PostgreSQLインポート:
    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製品
    • ネストされたカテゴリ
    • 製品ごとに複数の画像
    • 可変属性(サイズ、色など)
    • リアルタイム在庫更新

    ✅ JSONを使用 理由:
    • 階層的なカテゴリ構造
    • 製品タイプごとに柔軟な属性
    • 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でピボットテーブルに使用

    ✅ CSVを使用 理由:
    • 平坦な表形式データ
    • 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:設定管理

    要件:
    • アプリケーション設定
    • データベース認証情報
    • 機能フラグ
    • 環境固有の値

    ✅ JSONを使用(またはYAML/TOML) 理由:
    • 設定の論理的なグループ化
    • 異なるデータ型(ブール値、数値、文字列)
    • コメントが必要(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を使用 理由:
    • シンプルで平坦な構造
    • 大量(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

    要件:
    • コメント付きのユーザー投稿
    • いいね、シェア、メタデータ
    • ネストされたユーザープロフィール
    • リアルタイム更新

    ✅ JSONを使用 理由:
    • 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,email

    1,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: 以下の理由により高いメモリ:
    • オブジェクトのオーバーヘッド
    • 文字列キーが繰り返し格納される
    • ネストされた構造

    CSV: 低いメモリ:
    • シンプルな配列
    • キーストレージなし(ヘッダーは参照)
    • ストリーム処理が可能

    ---

    ベストプラクティス

    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)
    • 📧 メール添付

    覚えておいてください: 普遍的に「より良い」フォーマットはありません—正しい選択は特定のユースケースによって異なります。

    関連ツール

    ---

    関連記事

    ---

    最終更新日:2026年2月15日
    Share:

    関連記事

    Read in English