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への変換では、値を文字列のままにし、数値や日付への自動変換はしません。