JSON → CSV

JSON オブジェクトの配列を RFC 4180 準拠の CSV に変換します。ネストしたオブジェクトはドット区切りの列名に平坦化し、欠損フィールドにも対応。カンマ・セミコロン・タブ・パイプの区切り文字と Excel 用 BOM を選べます。

レコードを表に展開する。 オブジェクトの配列を貼り付けると、ヘッダー行付きの CSV が得られます。ネストしたオブジェクトはドット区切りの列名になり、欠けているフィールドは空セルに、区切り文字を含む値は RFC 4180 に従って引用符で囲まれます。

ツリーを表に変える

形の不一致

JSON はツリーで CSV は長方形です。したがってどんな変換でも、長方形に収まらない枝をどう扱うかを決めなければなりません。きれいに対応づく唯一の形が「平坦なオブジェクトの配列」で、オブジェクト 1 つが 1 行、キー 1 つが 1 列になります。それ以外はすべて追加のルールを要します。

ネストしたオブジェクトは簡単なほうです。{"role": {"team": "core"}}role.team という列名になり、値の位置が分かるうえ、たいていの表計算ソフトのインポートウィザードも理解できます。難しいのはネストした配列です。展開すると行数が変わり、周囲のデータを黙って複製してしまいます。本ツールはそれらを 1 つのセル内に JSON テキストとして保持します。検索性は失われますが、元データに存在しないレコードを作り出すことは決してありません。

欠損フィールドと列の順序

現実の JSON が均一であることはめったにありません。あるレコードには nickname があり次にはない、ある移行日以降にしか現れないフィールドがある、といった具合です。最初のオブジェクトだけを見て列を決める変換器は、それ以外を黙って捨ててしまいます。

ここでの列一覧は、全レコードの全キーの和集合を初出順に並べたものです。フィールドが欠けているレコードはスキップせず空セルを与えるため、行数は常に入力のレコード数と一致します。アルファベット順ではなく初出順を選んでいるのは、作者が意図したまとまりを保つためです。idname が散らばらず先頭に残ります。

引用符・区切り文字・Excel

RFC 4180 は、区切り文字・二重引用符・改行のいずれかを含むフィールドを引用符で囲むよう定め、埋め込まれた引用符は二重にしてエスケープします。本ツールはヘッダーを含むすべてのセルにこの規則を適用するため、Grace, Jr. のような値や複数行の住所も、準拠したパーサーとの往復で壊れません。

区切り文字の選択は見た目以上に重要です。カンマを小数点に使う地域——ヨーロッパ大陸の多く——では Excel はセミコロンを期待し、そうでなければ行全体が A 列に押し込まれます。BOM オプションは UTF-8 バイト順マークを先頭に付けます。これが Windows 版 Excel に、レガシーコードページではなく UTF-8 として読むよう指示します。付けないと非 ASCII の名前が文字化けします。どちらも既定で無効なのは、他のツールを壊すからです。Excel に渡すときだけ有効にしてください。

オープンソースに関する注記:バニラ JavaScript で実装。サードパーティライブラリは使用していません。

よくある質問

どんな入力形式を想定していますか?
オブジェクトの配列で、各オブジェクトが 1 行に対応します。単一のオブジェクトも受け付けて 1 行を出力しますが、文字列や数値の配列は表にできません。
ネストしたオブジェクトはどう扱われますか?
ドット区切りの列名に平坦化されます。{"role": {"team": "core"}} は role.team という列になります。平坦化をオフにすると JSON テキストのまま保持します。
ネストした配列が JSON のまま残るのはなぜですか?
展開すると行数が変わり、周囲のフィールドが複製されてしまうためです。1 セルに収めることで、出力の行数が常に入力のレコード数と一致します。
レコードごとにキーが違う場合はどうなりますか?
ヘッダーは全レコードの全キーの和集合を初出順に並べたものになり、フィールドが欠けているレコードには空セルが入ります。レコードが飛ばされることはありません。
BOM オプションはいつ使うべきですか?
Windows 版 Excel 向けのときだけです。バイト順マークが UTF-8 として読むよう指示します。付けないと非 ASCII 文字が化けます。他のツールでは BOM が余分な文字として見えることがあります。
Excel で 1 列にまとまってしまうのはなぜですか?
Excel はロケールのリスト区切り文字に従います。カンマを小数点に使う地域ではセミコロンを期待するため、区切り文字をセミコロンに変えて開き直してください。