CSVガイド

JSONをCSVに変換する方法と注意点

最終更新:

要点

JSONは入れ子や配列、null を持てますが、CSVは文字列の表です。変換するときは入れ子をどう列にするか、配列をどう1つのセルにするか、null・キーなし・空文字をどう区別するかを決める必要があり、CSVでは区別できなくなる情報があります。 桁の多い数値は、使うツールによっては変換の途中で丸められます。

例:注文データ

APIから取得した、架空の注文データです。

[
  {"order_id": 12345678901234567890, "customer": {"name": "架空 太郎", "postal": "0000001"}, "items": ["ノート", "ペン"], "total": 1200, "note": null},
  {"order_id": 12345678901234567891, "customer": {"name": "見本 花子", "postal": "0000002"}, "items": [], "total": 0.50, "note": ""}
]

入れ子を customer.name のような列に分け、配列をJSONの文字列のまま1つのセルに入れると、次のCSVになります。

order_id,customer.name,customer.postal,items,total,note
12345678901234567890,架空 太郎,0000001,"[""ノート"",""ペン""]",1200,
12345678901234567891,見本 花子,0000002,[],0.50,

1行目の note は null、2行目は空文字ですが、CSVではどちらも空のセルになり、見分けがつかなくなります。

変換で決めること

JSONの要素主な書き方注意点
入れ子のオブジェクトcustomer.name のように列に分ける/JSONの文字列として1セルに入れる列に分けると、同じ名前になるキーがぶつかることがあります。
配列JSONの文字列のまま/区切り文字でつなぐ/1要素ずつ列に分ける区切り文字でつなぐと、要素の中に同じ区切り文字があった場合に元へ戻せません。
null空のセル/null という文字空のセルにすると、キーがない場合や空文字と区別できません。
数値JSONに書かれた表記のまま0.50 を 0.5 にしたり、桁の多い数を丸めたりしないことが大切です。

桁の多い数値が変わる理由

  • JavaScriptの数値は約16桁まで。一般的な JSON.parse で読むと、12345678901234567890 は 12345678901234567000 になります。読み込んだ時点で下の桁が失われるため、変換後には気づきにくい問題です。
  • Excelの数値は15桁まで。CSVをExcelで開くと、16桁以上の番号は指数表示になり、保存すると元に戻りません。
  • 先頭の0も同じ。郵便番号やコードは、JSONで文字列("0000001")になっていれば、CSVでも文字列のまま残せます。

CSVをJSONに戻すとき

  • CSVの値はすべて文字列です。007、2026-01-02、true を推測で数値・日付・真偽値に変えると、元の値が失われることがあります。
  • 空のセルを空文字にするか null にするかを決めます。どちらを選んでも、元のJSONで区別されていた情報は戻りません。

Kakerio(JSON ↔ CSV)での扱い

  • 数値は元の表記のまま書き出します。桁の多い数や 0.50、1e3 も、JSONに書かれた文字のままCSVに入ります。
  • CSVで区別できなくなる情報を知らせます。null・キーなし・空文字が混ざる場合、区切り文字でつないだ配列が戻せない場合、キーが同じ列名になる場合などに警告を表示します。
  • 数式に見えるセルを知らせます。先頭が = + - @ のセル(負の数は除く)を数え、必要なら先頭に ' を付けて書き出せます。値が変わるため、既定ではオフです。
  • 文法エラーは行と文字の位置で表示します。末尾のカンマなど、JSONとして正しくない書き方を見つけられます。
  • CSVからJSONへの変換では、値を文字列のままにし、数値や日付への自動変換はしません。