記事
CSV、XML、JSON、YAML間の変換:実践ガイド
CSV、JSON、XML、YAMLは、データパイプライン、設定ファイル、APIで開発者が最もよく使う4つのフォーマットです。データモデルが一致するときは変換が簡単で、一致しないときは予想以上にデータが失われます。このガイドでは、各フォーマットが表現できること・できないこと、変換時に情報が消える場所、そして無音のデータ破損を引き起こすエンコーディングの落とし穴を解説します。このサイトのdata-converterツールは、4つのうち3つ(CSV、JSON、YAML)をブラウザ内で処理します。XMLについてのセクションは、手作業や別のツールでデータを移す際の背景知識として扱ってください。
4つのフォーマットとそのデータモデル
CSVはデータを行と列のフラットなグリッドとして整理します。通常、最初の行が列名を示し、以降の各行が1件のレコードです。ネスト構造はなく、型情報もなく、セル内のプレーンテキスト以外に標準仕様はありません。値を消費するアプリケーションが型を強制しない限り、すべての値は文字列として扱われます。 JSONはオブジェクト(キーと値のマップ)と配列のツリーとしてデータをモデル化します。値には文字列、数値、ブール値、null、任意の深さのネストされたオブジェクトや配列が使えます。これにより、1つのJSONドキュメントで、住所オブジェクトが埋め込まれた顧客レコード、明細項目の配列、型付きの数値合計を表現できます。 XMLはエレメントのツリーとしてデータをモデル化します。各エレメントは名前付き属性を持ち、子エレメントやテキストコンテンツを含めることができます。組み込みの数値型やブール型はなく、すべてがテキストです。XSDなどのスキーマで検証時に型を強制できますが、ワイヤーフォーマットは常に文字データです。 YAMLはインデントを使ってJSONと同じオブジェクトと配列のモデルを表現しますが、より読みやすい構文を採用しています。YAMLはJSONのスーパーセットです:有効なJSONドキュメントはすべて有効なYAMLでもあります。YAMLは複数行の文字列、コメント、繰り返しブロックのアンカーエイリアス参照も追加します。YAMLは設定ファイルで一般的で、JSONはAPIレスポンスで一般的です。

非可逆変換:フラット化とXMLの曖昧さ
最もよくある非可逆変換は、ネストされたJSONやXMLをCSVにフラット化することです。ネストされた住所フィールドを持つJSONオブジェクトは、CSVの行にきれいにマッピングできません。よくある回避策はドット記法の列名です:customer.address.cityは独自の列になります。これはネストが1段階の場合は機能しますが、配列が現れると完全に壊れます。3つの電話番号を持つ顧客には、3つの別々の列(最大数をハードコード)、2番目のCSVファイルへの分割、または1つのセル内の区切り文字列としての配列エンコードのどれかが必要です。これらのオプションはどれも、追加のメタデータなしで元のJSONに戻すことができません。 XMLには別の曖昧さがあります:属性と子エレメントのどちらを選ぶかという問題です。値「Paris」は属性として(<city name="Paris">)または子エレメントとして(<city><name>Paris</name></city>)保存できます。コンバーターがXMLを読み込んでJSONを生成するとき、属性をどうマッピングするかを決める必要があります。よくある規則には、属性キーに@プレフィックスを付けるか、"_attributes"キーの下に配置するかがあります。この選択は標準化されていないため、同じXMLを読む2つのコンバーターが構造的に異なるJSONを生成することがあります。XMLとJSONの間でデータを往復させる予定がある場合は、開始前に規則を固定してください。
CSVの落とし穴:区切り文字、クォート、エンコーディング
CSVには単一の正式な標準はなく、広く引用される参考としてRFC 4180があるのみです。最も一般的な区切り文字はカンマですが、セミコロン(小数点区切りとしてカンマを使うヨーロッパのロケールで一般的)、タブ(TSV)、パイプも実際に使われます。.csvという拡張子のファイルは、どれを使っているかを示すことなくそのどれかを使っている可能性があります。 フィールド値に区切り文字自体が含まれる場合、RFC 4180はフィールドをダブルクォートで囲むことを要求します:"San Francisco, CA"。クォートされたフィールド内のダブルクォートは、重複させることでエスケープしなければなりません:"He said ""hello"""。リテラルの改行を含むフィールドもクォートする必要があります。この手順を省略するパーサーは、追跡が難しい行数エラーを生み出します。 エンコーディングは別の落とし穴です。Windowsツールからのファイルには、UTF-8 BOM(バイト順マーク:ファイル先頭の3バイト EF BB BF)が含まれることがよくあります。BOMはExcelがエンコーディングを識別するのに役立ちますが、多くのプログラミング言語のパーサーはBOMを最初の列名の一部として扱い、"id"ではなく"id"という列名を生成します。これは、名前で列を検索するダウンストリームコードを壊します。CSVファイルをプログラムで読み取るときは、解析前にBOMを除去するか、明示的に処理するライブラリを使用してください。

フォーマットの選択:設定、交換、スプレッドシート
フォーマットの選択は通常、好みではなく文脈によって決まります。 JSONはREST APIとブラウザとサーバー間の交換のデフォルトです。コンパクトで、すべてのプログラミング言語でネイティブに解析でき、数値とブール値の型情報を持ちます。弱点はコメントがないことで、開発者が手で読み書きするファイルには不向きです。 YAMLは設定ファイル(Kubernetesマニフェスト、CIパイプライン定義、Ansibleプレイブック)に適しています。インラインコメントが使え、多くのインデント階層のあるJSONより読みやすいためです。主なリスクはインデントエラーが無音であること:インデントがずれたキーはパースエラーなしに別のスコープに移動します。 XMLは古いエンタープライズシステム、SOAPウェブサービス、ドキュメントフォーマット(DOCX、SVG、RSS)、スキーマ検証や名前空間の明確化が必要な文脈で標準です。冗長ですが、XPathとXSLTツールは成熟しています。 CSVはデータが本当にフラットで、消費者がスプレッドシートアプリケーションかデータアナリストである場合に適しています。型システムもネスト構造もないため、設定やAPIの交換には適しません。
data-converterでローカル処理する
このサイトのdata-converterツールは、CSV、JSON、YAML間の解析と変換をすべてブラウザ内で行います。XMLの読み書きには対応していません。いかなる時もデータはサーバーに送信されません。変換はローカルのJavaScriptランタイムで実行され、デバイスから何も出ることなくダウンロードまたはコピーで出力を取得できます。 これは、共有する権限のないデータにとって重要です:個人情報を含むAPIレスポンス、内部ホスト名を持つ設定ファイル、内部データベースからのCSVエクスポートなど。そのデータをサーバーで動作するウェブベースのコンバーターに貼り付けることは、コンテンツがネットワーク経由で送信され、管理できないハードウェアで処理されることを意味します。data-converterでは、ブラウザタブが処理環境です。 ツールはCSVの読み書きにRFC 4180のクォート規則を適用し、JSONまたはYAMLからCSVへの変換ではオブジェクトのフラットな配列を前提とします。キーの値がネストされたオブジェクトや配列の場合、自動的なドット記法でのフラット化は行われないため、別々の列として必要な場合は変換前にご自身でそれらのフィールドをフラット化してください。XMLとの間でデータを移す必要がある場合は、まず専用のXMLツールでJSONまたはYAMLに変換してから、ここに持ち込んでください。
この記事で紹介するツール
よくある質問
JSONをCSVを経由して往復させ、元の状態に戻せますか?
JSONがネストされたフィールドも配列値もないオブジェクトのフラットな配列である場合のみ可能です。ネストされたオブジェクトや配列値が存在する瞬間、CSV表現は自動的に逆変換できない構造的な決定(ドット記法の列、複数の行、またはエンコードされた文字列)を必要とします。データにネストがある場合は、JSON、XML、またはYAMLなら往復できます;CSVではできません。
ヨーロッパのアプリケーションからエクスポートした後、CSVがExcelで正しく表示されないのはなぜですか?
ヨーロッパのロケールでは、カンマが小数点表記に使われるため、CSVの区切り文字としてセミコロンを使うことが多いです。ヨーロッパのロケールのExcelはセミコロンを想定しています。ファイルがカンマを使っている場合、Excelは行全体を1つの列として扱います。修正方法は、エクスポート設定で区切り文字を変更するか、ExcelのデータインポートウィザードでK区切り文字を手動で指定することです。UTF-8 BOMの問題は別です:BOMがない場合、Excelはアクセント付き文字を文字化けして読み取る可能性もあります。
YAMLとJSONの実際の違いは何ですか?
どちらも同じ基本データモデルを表現します:オブジェクト、配列、文字列、数値、ブール値、null。YAMLはコメント(#で始まる行)、複数行の文字列リテラル、繰り返しブロックのアンカー参照を追加します。JSONは有効なYAMLの厳密なサブセットですが、JSONパーサーはYAMLを読みません。実践的なルール:JSONはAPIペイロードとデータストレージに使い、YAMLはインラインコメントから恩恵を受ける人間が編集する設定ファイルに使います。