JSONからCSVへ、そしてその逆:開発者のための完全ガイド

· 12分で読めます

JSONとCSV形式間の変換は、すべての開発者が遭遇する日常的なタスクの1つです。分析のためにAPIデータをエクスポートする場合でも、スプレッドシートデータをアプリケーションにインポートする場合でも、システム間でデータを変換する場合でも、これらの変換を完全に理解することで、無数の時間の無駄を省くことができます。

このガイドでは、基本的な変換から複雑なネスト構造の処理、大きなファイルのストリーミング、経験豊富な開発者でもつまずくエッジケースの対処まで、すべてをカバーしています。

目次

JSONとCSVをいつ使用するか

変換技術に入る前に、各形式がどのような場面で優れているかを理解しましょう。最初から適切な選択をすることで、不要な変換やデータ構造の問題を回避できます。

JSONの強み

JSON(JavaScript Object Notation)は、柔軟性と構造が必要な場合に優れています。現代のWebアプリケーションとAPIにとって、これが標準形式である理由があります。

CSVの強み

CSV(Comma-Separated Values)は表形式データの主力です。1970年代から存在しており、今後もなくなることはありません。

一般的な変換シナリオ

形式間の変換が必要になる典型的な場面は次のとおりです:

シナリオ 方向 理由
APIデータ分析 JSON → CSV APIからデータを取得し、Excelやデータサイエンスツールで分析
データベースエクスポート CSV → JSON データベースからエクスポートし、REST API経由で送信
設定レビュー JSON → CSV 複雑な設定ファイルをスプレッドシートに変換して関係者がレビュー
一括データインポート CSV → JSON スプレッドシートデータをWebアプリケーションにインポート
データ移行 両方向 異なる形式要件を持つシステム間でデータを移動

プロのヒント: データを頻繁に変換する必要がある場合は、コードを書かずに迅速なブラウザベースの変換を行うために、JSONからCSVへのコンバーターまたはCSVからJSONへのコンバーターの使用を検討してください。

Python:JSONからCSVへの変換

Pythonは、JSON-CSV変換に複数のアプローチを提供します。pandasライブラリ(ほとんどのユースケースに最適)と標準ライブラリのcsvモジュール(依存関係ゼロが必要な場合)の両方を見ていきましょう。

Pandasの使用(推奨)

Pandasは、Pythonでのデータ操作のスイスアーミーナイフです。JSONからCSVへの変換では、これに勝るものはありません。

import pandas as pd
import json

# 方法1:ファイルから
with open('data.json', 'r', encoding='utf-8') as f:
    data = json.load(f)

df = pd.DataFrame(data)
df.to_csv('output.csv', index=False, encoding='utf-8')

# 方法2:JSON文字列から
json_string = '{"users": [{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}]}'
df = pd.read_json(json_string)
df.to_csv('users.csv', index=False)

# 方法3:URL(APIエンドポイント)から
df = pd.read_json('https://api.example.com/data')
df.to_csv('api_data.csv', index=False)

json_normalizeを使用したネストされたJSONの処理

JSONにネストされたオブジェクトがある場合、json_normalizeは構造を表形式にフラット化します。

from pandas import json_normalize
import json

# ネストされたJSONの例
nested_data = {
    "users": [
        {
            "name": "Alice",
            "age": 30,
            "address": {
                "city": "New York",
                "country": "USA"
            }
        },
        {
            "name": "Bob",
            "age": 25,
            "address": {
                "city": "London",
                "country": "UK"
            }
        }
    ]
}

# ネスト構造をフラット化
df = json_normalize(nested_data['users'])
# 列は次のようになります:name