データ · 5分で読めます ·
フィールドをひとつも失わずに JSON を CSV へ
ネストしたキー、省略可能なフィールド、文字列中のカンマ。4Dev が乱雑な JSON をスプレッドシート向けの CSV に平坦化するしくみ。

スプレッドシートは平らで、JSON はそうではありません。JSON から CSV への変換では、ネストしたオブジェクト、配列、一部のレコードにしかないキーをどう扱うかを決める必要があります。4Dev の変換ツールが実際に行うのは次のとおりです。
すべてのキーに列ができる
見出し行は、最初のレコードだけでなく、すべてのオブジェクトのキーから、初めて現れた順に作られます。キーが欠けているレコードには空のセルが入るので、列がずれることも、省略可能なフィールドが消えることもありません。
[{"id":1,"name":"Ada"},
{"id":2,"name":"Alan","note":"optional"}]
id,name,note
1,Ada,
2,Alan,optional
ネストしたオブジェクトはアンダースコア区切りの列に
オブジェクトはキーをアンダースコアでつないで平坦化されるため、{"address":{"city":"Lisbon"}} は address_city という列になります。単純な値の配列は 1 つのセルに入り("admin, dev")、オブジェクトの配列はそのセルに JSON テキストとして残るので、何も捨てられません。
カンマや引用符は自動でエスケープ
カンマ、ダブルクォート、改行を含む値はダブルクォートで囲まれ、中の引用符は二重になります。Excel や Google スプレッドシートが想定する標準的な CSV のルールです。
2,"Alan, T.","says ""hi"""
CSVをExcelで開く
CSVには独自の設定がないので、Excelは推測で開きます。よく起きる問題は2つです。小数点にカンマを使う国では、Excelは列の区切りにセミコロンを期待し、1行全体を1つのセルに入れてしまうことがあります。また、ファイルがUTF-8ではなくローカルの文字コードで開かれると、日本語、ヘブライ語、アクセント付き文字、絵文字が文字化けします。どちらの場合も、Excelの[データ]→[テキストまたはCSVから]を使い、UTF-8と区切り文字のカンマを選べば列が正しく表示されます。
先頭のゼロと長い数字
表計算ソフトは数字に見えるものをすべて数値として扱います。01234のような郵便番号は先頭のゼロを失い、1234567890123456のような16桁のIDは丸められて1.23457E+15と表示されます。CSV自体は正しく、壊れるのはExcelが開いたときです。そうした列は文字列として取り込み、長いIDはJSONの中で文字列("id": "1234567890123456")として送れば、どのツールでもそのまま保たれます。
レコードの中の配列
配列はどんな変換でもいちばん難しい部分です。1つのレコードが多くの値を持てるのに対し、CSVの行は1列に1セルしかないからです。複数の行に分ければほかのフィールドがすべて重複し、番号付きの列(tags_1、tags_2…)に分ければファイルごとにヘッダーが変わります。単純な値のリストは1つのセルに、オブジェクトの配列はJSONテキストとして入れておけば、各レコードはきっちり1行のままで、必要なら元のデータを復元できます。
共有する前に結果を確認する
- 行数がJSON配列のレコード数と一致している。
- ヘッダーに、省略可能なものも含めて期待するフィールドがすべてある。
- ネストしたフィールドがaddress_cityのようなアンダースコア付きの列になっている。
- カンマ、引用符、改行を含む値が1つのセルに収まっている。
表計算ファイルや逆方向の変換が必要なら
4DevのJSONからCSVへの変換ツールは、毎回同じフラット化のルールを適用します。よくあるほかのケースは、JSONからExcel、CSVからJSONのツールでカバーできます。手早く確かめるなら、まず数件のレコードを貼り付けて列を確認し、それからファイル全体を変換しましょう。