メインコンテンツへ移動

JSONをCSVに変換

「JSONをCSVに変換」は、レコードの配列を表計算ソフトですぐ使える表にブラウザ内で変換します。ネストしたオブジェクトや配列は、ただ平坦化して消すのではなく、明示的で可逆なカラムパスになります。カラム集合は全レコードの和集合なので、後の行にしか現れないフィールドも生き残ります。

端末内で処理
JSON
0 B1 行行 1、列 1
CSV読み取り専用
0 B1 行

JSONをCSVに変換はどう動きますか?

この変換の難しい部分は構文ではなく、形の不一致です。CSVは長方形です。固定のカラム集合、レコードごとに1行、セルごとに1つのスカラー。一方、JSONは木です。どのコンバーターも、レコードが{"customer":{"name":"Ada"}}を含むときに何が起きるかを決めなければなりませんが、大半は黙って決めます。ネストしたオブジェクトを捨てるか、セルに[object Object]を貼り付けるか、サブツリー全体を1つのフィールドの中にJSONとして書き戻すかです。

このツールが下した決断は、明示的なパスのエンコーディングです。オブジェクトのメンバーにはcustomer.name、配列のインデックスにはtags[0]。2つの記法を意図的に違えることで、マッピングを可逆にしています。ドットだけでは、a.0が配列なのか、キーが“0”であるオブジェクトなのか判別できず、CSVを経由する往復は推測に頼ることになります。結果を「CSVをJSONに変換」に貼り付ければ、最初のドキュメントが返ってきます。

2つ目の決断はカラム集合です。素朴な実装は最初のレコードからキーを読んでヘッダーにします。そして、後から現れるフィールドを黙って失います。実際の書き出しは不均一です。50件に1件しか付かない任意の備考、ときどきしか適用されない割引。このツールのカラム集合は、全レコードにわたる和集合で、順序は最初に現れた順です。何も捨てられず、順序も自然に読めます。

配列には選択肢があります。正解が存在しないためです。展開(Explode)は各要素に専用のカラムを与え、正確に往復できます。結合(Join)は区切り文字で1つのセルにまとめます。表計算ソフトで開く人にはたいていこちらが望ましいのですが、情報は落ちるので、スカラーの配列にだけ適用されます。オブジェクトの配列は常に展開されます。結合しては破壊してしまうからです。

引用符の付け方はRFC 4180に従います。フィールドに、区切り文字、ダブルクォート、改行、あるいは表計算ソフトに取り込むときに剥ぎ取られる前後の空白が含まれる場合に、引用符を付けます。引用符付きフィールドの中の引用符は2つ重ねます。それ以外は裸で出力します。すべてのセルを引用符で囲んだファイルは、読みにくくなるだけで正確にはならないからです。

JSON入力

[
  { "id": 1, "user": { "name": "Ada" }, "tags": ["a","b"] },
  { "id": 2, "user": { "name": "Grace" }, "tags": ["c"], "vip": true }
]

CSV出力

id,user.name,tags[0],tags[1],vip
1,Ada,a,b,
2,Grace,c,,true

JSON入力 → CSV出力

JSON入力

[
  { "id": 1, "customer": { "name": "Ada", "city": "London" }, "total": 42.5 },
  { "id": 2, "customer": { "name": "Grace", "city": "New York" }, "total": 7 }
]

CSV出力

id,customer.name,customer.city,total
1,Ada,London,42.5
2,Grace,New York,7

JSONをCSVに変換が対応するオプションとエッジケースは?

技術リファレンスとオプション
パラメータ型デフォルト動作とエッジケース
区切り文字, ; tab |,コンマが小数点として使用されるロケールでは、セミコロンが事実上の標準であり、Excelもそれを期待します。タブはデータ内にタブがほとんど存在しないため、引用符の使用をほとんど必要としません。
配列モードexplode | joinexplodeexplodeはtags[0]、tags[1]のように展開し、完全に双方向変換可能です。joinはスカラーを1セルにまとめ、情報が失われます。オブジェクトの配列は常に展開されます。なぜなら、結合すると構造が完全に失われるためです。
すべてを引用符で囲む真偽値falseデフォルトでは、フィールドはRFC 4180で要求される場合のみ引用符で囲まれます。厳密なインポートツールでは、すべてを引用符で囲む方が好ましい場合があります。いずれにしても、出力は有効です。
ヘッダ行真偽値trueフラット化された列パスを1行目に出力します。これがない場合、列の意味は位置のみに依存し、JSONへの変換時にネストを復元できません。
列セットunion全レコードすべてのレコードに現れる列を、最初に現れた順に出力します。1レコード目のヘッダを読み取るのは、コンバータがデータを静かに削除する最も一般的な方法です。
null値空セルテキスト「null」ではなく空のフィールドとして書き込まれます。なぜなら、表計算ソフトはリテラルの単語を文字列として扱うためです。これは、出力においてnullと absent が区別できないことを意味します。これはCSVの性質であり、このツールの問題ではありません。
トップレベルの形状array | objectarrayレコードの配列が想定される入力形式です。単一のオブジェクトは1行になります。配列メンバがちょうど1つだけのオブジェクト——ほとんどのAPIが返す{"data":[…]}のラッパー——は、その配列を使用し、その旨を出力します。
入力サイズbytes8 MB変換はメインスレッドで実行されるため、このサイズを超える場合は試行されず、拒否されます。どのサイズでもアップロードは行われません。

よくある質問

ネストしたオブジェクトはどうなりますか?

ドット付きのカラム名になります。{"customer":{"name":"Ada"}}は、customer.nameというカラムになります。配列はブラケット記法(tags[0]、tags[1])を使うので、両者を区別でき、変換は可逆です。これが大半のコンバーターとの違いです。多くのコンバーターは、ネストしたオブジェクトを捨てるか、セルに[object Object]と書くか、1つのフィールドにJSONの塊を押し込んでしまいます。

レコードごとにフィールドが違う場合、フィールドが欠落しますか?

いいえ。カラム集合は全レコードのフィールドの和集合で、順序は最初に現れた順です。50件の注文のうち1件にしか現れない備考も、専用のカラムを持ち、他の行は空セルになります。最初のレコードだけからヘッダーを読むコンバーターは、そうしたフィールドを黙って失います。ここで最も避けたい失敗です。

CSVを元のJSONに戻せますか?

はい。展開(Explode)モードとヘッダー行を有効にすれば可能です。結果を「CSVをJSONに変換」に貼り付けると、カラムパスからネストが再構築されます。ただし2つの注意点は、ツールではなくCSVという形式自体に由来します。セルは文字列"22201"と数値22201を区別できませんし、空文字列と存在しないフィールドも区別できません。

Excelで数値のカラムに引用符が付いたり、日付として表示されたりするのはなぜですか?

ファイルではなく、Excelの取り込み時の推測のせいです。日付らしいものは強引に日付として再解釈し、数値らしいものは先頭の0を落とします。製品コードや郵便番号が壊れる原因です。ファイルをダブルクリックする代わりにデータ → テキストまたはCSVからを使い、取り込みダイアログで該当するカラムをTextに設定してください。

JSONはどこかへアップロードされますか?

いいえ。変換はブラウザ内で実行されます。DevToolsを開き、Networkパネルを見ながらドキュメントを貼り付けてみてください。リクエストは1つも飛びません。これは見た目以上に重要です。CSVに変換されるJSONは、たいてい実レコードの書き出しです。表計算ソフトに届ける途中で、まさにそうしたデータを知らないサーバーに通すべきではありません。

区切り文字はどれを選べばよいですか?

理由がなければカンマです。カンマが小数点記号として使われるロケールの人に渡す場合はセミコロンにしてください。相手のExcelがそれを期待しており、カンマ区切りのファイルはそこでは1カラムとして開かれます。データにカンマと引用符が大量にある場合はタブも有効です。タブはフィールド内にほとんど現れず、ファイルも読みやすいままです。

JSONをCSVに変換でできるそのほかのことは?