JSON、YAML、CSV:どれをいつ使うか、そして変換方法
データセットをダウンロードするとCSV形式。APIはJSONを返す。設定ファイルはYAML。同僚がJSONファイルを送ってきてスプレッドシートにしてほしいと頼む。別の同僚がYAMLの設定ファイルを渡してきて、別のツール用にJSONが必要だと言う。
データ形式の変換は、実際にやるまでは簡単そうに見えるタスクの一つです。どの形式をいつ使うか、そしてそれらの間をどう移動するかを理解すれば、実際に時間を節約できます。
3つの形式の概要
JSON (JavaScript Object Notation)
{
"name": "Alice",
"age": 30,
"skills": ["Python", "SQL", "Docker"],
"address": {
"city": "Berlin",
"country": "Germany"
}
}
概要: オブジェクト(キーと値のペア)、配列(順序付きリスト)、文字列、数値、ブール値、nullをサポートする構造化データのテキスト形式。
長所: 機械可読、すべてのプログラミング言語で幅広くサポート、ネストされたデータを自然に扱える、厳密な構文で曖昧さを防止。
短所: 冗長(中括弧、角括弧、引用符が多い)、YAMLほど人間に読みやすくない、コメント非対応。
YAML (YAML Ain't Markup Language)
name: Alice
age: 30
skills:
- Python
- SQL
- Docker
address:
city: Berlin
country: Germany
概要: 中括弧や角括弧の代わりにインデントを使用する、人間に優しいデータシリアライズ形式。JSONのスーパーセットであり、有効なJSONは有効なYAMLでもある。
長所: 非常に読みやすい、コメント対応、視覚的ノイズが少ない、設定ファイルに最適。
短所: インデントに敏感(間違ったスペースで壊れやすい)、予想外のパース動作がある、JSONより解析が遅い。
CSV (Comma-Separated Values)
name,age,city,country
Alice,30,Berlin,Germany
Bob,25,London,UK
Charlie,35,Paris,France
概要: 各行が1つの行で、行内の値がカンマ(またはセミコロンやタブ)で区切られたフラットなテキスト形式。
長所: 汎用的(すべてのスプレッドシート、データベース、データツールが対応)、表形式データではコンパクト、読みやすく作りやすい。
短所: ネストされたデータ非対応、データ型なし(すべてが文字列)、特殊文字の標準規格なし、フラットなテーブルに限定。
ご存知ですか? YAMLは技術的にはJSONのスーパーセットです。つまり、有効なJSONドキュメントは自動的に有効なYAMLドキュメントになります。JSONをYAMLパーサーに貼り付けても動作します。逆は成り立ちません。YAMLの機能(コメント、アンカー、複数行文字列)にはJSON相当のものがありません。
どれをいつ使うか
| ユースケース | 最適な形式 | 理由 |
|---|---|---|
| APIリクエストとレスポンス | JSON | 業界標準、すべての言語がネイティブサポート |
| 設定ファイル | YAML | 人間が読みやすく、ドキュメント用のコメント対応 |
| スプレッドシートデータ | CSV | Excel、Google Sheetsなどで直接開ける |
| データベースエクスポート | CSV | フラットな表形式データが行と列に直接マッピング |
| 複雑なネストデータ | JSONまたはYAML | CSVはネストを表現できない |
| システム間のデータ交換 | JSON | 曖昧さのないパース、厳密な仕様 |
| 人間が編集する設定 | YAML | 手作業での読み書きが容易 |
| 単純なデータリスト | CSV | 軽量、オーバーヘッドなし |
形式間の変換
JSONからYAML
最も一般的な設定変換です。あるツールのJSON設定があり、別のツール用にYAMLが必要な場合。YAMLはJSONが持つすべてをサポートしているため、変換は簡単です。
{"server": {"host": "0.0.0.0", "port": 8080}}
変換結果:
server:
host: 0.0.0.0
port: 8080
YAMLからJSON
YAMLからJSONへの変換も簡単ですが、コメントが失われ(JSONはコメント非対応)、結果はより冗長になります。
JSONからCSV
フラットなJSON配列(同じキーを持つオブジェクトの配列)でうまく機能します。各オブジェクトが行になり、各キーが列ヘッダーになります。
[
{"name": "Alice", "age": 30},
{"name": "Bob", "age": 25}
]
変換結果:
name,age
Alice,30
Bob,25
注意 JSONにネストされたオブジェクトや配列が含まれている場合、JSONからCSVへの変換はうまくいきません。CSVはフラットであり、「skills」配列やネストされた「address」オブジェクトを表現する方法がありません。ネストされたデータは、フラット化(address.city、address.countryを別々の列にする)するか、CSVセル内の文字列としてシリアライズする必要があります。
CSVからJSON
各行がオブジェクトになり、列ヘッダーがキーになります。単純な表形式データではきれいに変換できます。
CSVからYAML
あまり一般的ではありませんが、同じロジックに従います。各行がYAMLマッピングになり、ファイル全体がYAMLシーケンスになります。
よくある落とし穴
CSVのエンコーディング問題
CSVファイルは異なる文字エンコーディング(UTF-8、Latin-1、Windows-1252)を使用できます。CSVを開いて「München」ではなく「München」のような文字化けが表示される場合は、エンコーディングの不一致です。可能な限りUTF-8を使用してください。
CSVの区切り文字の混乱
すべてのCSVがカンマを使用するわけではありません。ヨーロッパのCSVでは、多くのヨーロッパの数値形式でカンマが小数点区切りとして使用されるため、セミコロンがよく使われます。タブ区切り値(TSV)も一般的なバリエーションです。
YAMLのインデントエラー
YAMLはインデント(スペース、タブは不可)を使用して構造を定義します。不整合なインデントや、タブとスペースの混在は、パースエラーや黙って誤解釈される原因になります。インデントレベルごとに正確に2つのスペースを使用し、エディタがタブの代わりにスペースを挿入するよう設定してください。
注意 YAMLでは、文字列noはブール値falseとしてパースされ、yesはtrueとしてパースされます。文字列1.0は数値としてパースされます。リテラル文字列の「no」「yes」「1.0」を意味する場合は、引用符で囲む必要があります:"no"、"yes"、"1.0"。これはYAMLの最も悪名高い落とし穴の一つです。
JSONの末尾カンマ
JSONでは末尾のカンマは許可されていません。これはJavaScriptでは有効ですが、JSONでは無効です:
{"name": "Alice", "age": 30,} // 無効なJSON:末尾のカンマ
大規模ファイルのパフォーマンス
非常に大きなデータセット(数百万行)の場合、CSVはJSONやYAMLよりも効率的です。レコードあたりのオーバーヘッドが最小限だからです。JSONはすべての値に中括弧と引用符を追加するため、大規模な表形式データではファイルサイズが大幅に増加します。
変換のための実用ツール
簡単な一回限りの変換には、ブラウザベースのツールが最速の選択肢です。データを貼り付けるかアップロードし、出力形式を選択して、すぐに結果を取得できます。
ヒント JSON、YAML、CSV形式間を瞬時に変換:データ形式の変換方法。データを貼り付け、出力形式を選択し、結果をコピーまたはダウンロードできます。
特にJSONを扱う場合、JSONを検証してきれいに表示するフォーマッターは非常に便利です:
- JSONフォーマッター — JSONの検証、整形、圧縮
- JSONからCSVコンバーター — JSON配列をCSVに変換
- YAML-JSONコンバーター — YAMLとJSON間の変換
- CSVビューアー — CSVファイルの表示と探索
今すぐデータを変換:
すべてのツールは無料で、ブラウザ上で直接動作します。