ブログ一覧へ
tutorial 2026-06-14

JSON、YAML、XML、CSV —— 1 つのツールボックスでラウンドトリッピング(2026)

JSON、YAML、XML、CSV —— 1 つのツールボックスでラウンドトリッピング

任意の生きた本番システムで、データはフォーマットを継続的にシフトします。Stripe API レスポンス(JSON)が CI スクリプト(YAML)に到達。Kubernetes manifest(YAML)が監査スプレッドシート(CSV)に。レガシー SOAP エンドポイント(XML)がモダン JSON 消費者に。すべての変換は、データ型の不一致からエスケープバグから sapiens な構造変更まで、サイレント破損のリスクです。

このガイドは、JSON、YAML、XML、CSV 間で安全にデータを変換する方法、フォーマット境界で迷う一般的なバグ(NaN、無限大、ロケール区切り文字、エンコーディング問題)、そして信頼できない入力で動作するときに気にすべきセキュリティ考慮事項をカバーします。すべての 4 つのフォーマット間で 1 つのインターフェースで動作する Ai2Done Format Converter にも触れます。

TL;DR

  • JSON は API とデバッグの安全なデフォルト —— 厳格、エンコードに曖昧さなし。
  • YAML は人間が編集する設定に勝つ —— 厳格構文を犠牲にして読みやすい。
  • XML はレガシー / エンタープライズ / SOAP の世界に住む —— 過剰だがどこにでもある。
  • CSV は表形式エクスポート / Excel 互換性に勝つ —— ただし型情報なし、エッジケースのワイルドウェスト。
  • 任意のペア間でラウンドトリップ変換と並べて検証用に Ai2Done Format Converter を使用。

なぜ見た目より難しいのか

「JSON を YAML に変換」はマクロ機能のように聞こえます。実際には、4 つのフォーマットには非互換な型システムがあり、ナイーブな変換器は不一致を静かに失います:

フォーマット データ型 コメント 重複キー 順序 型推論
JSON string、number、bool、null、object、array 不可 仕様で禁止 object: 未定義;array: 順序付き 厳格
YAML string、number、bool、null、date、binary、object、array、custom tags はい 不可(ほとんどのパーサー) object: 順序付き;array: 順序付き 寛容(自動キャスト)
XML すべてのスカラーは文字列;構造は要素 / 属性 はい はい 順序付き なし(手動)
CSV すべてのスカラーは文字列 RFC 4180 ではいいえ はい(重複ヘッダー) 順序付き なし

「JSON → YAML → JSON」のラウンドトリップは結構な仕事をします(YAML は JSON のスーパーセット)。しかし「YAML → JSON」のような変換は静かに以下を失います:

  • コメント(JSON にはなし、永久に失う)
  • アンカーとエイリアス&ref*ref —— JSON でインライン化)
  • キー順序(JSON object の順序付けは未定義;多くのパーサーはアルファベット化)
  • マルチドキュメント YAML--- 区切りファイル —— JSON にはマッピングなし、最初を取得、残りを警告なしで失う)

「XML → JSON」のような変換は曖昧な選択を直面します:属性は子要素になるべきか、それとも @attr プレフィックス付きの兄弟プロパティになるべきか?テキスト本文は "#text" として現れるべきか、それとも要素を string に折りたたむべきか?これらの選択を異なる方法で行う 4 つの一般的な XML-to-JSON コンベンションがあります。

「CSV → JSON」のような変換は型を推論する必要があります:「123」は number か string?「2026-01-15」は date か string?「TRUE」は bool か string?ナイーブな変換器は推測し、しばしば間違って取得します(電話番号は number になる;ゼロが落ちる)。

良いツールボックスはあなたに選択肢を与えます:「型を推論」対「すべてを文字列として保持」、「コンパクト出力」対「インデント / 美しい印刷」、属性処理の異なる XML スタイル、エンコードと区切り文字の異なる CSV ダイアレクト。

方法 1:Ai2Done Format Converter(ブラウザ、4 フォーマット、明示的オプション)

Ai2Done Format Converter は 4 つのフォーマット間の変換を 1 つのインターフェースに、すべての重要なオプションが明示的に:

  1. 任意のブラウザで /tools/format_converter を開く。
  2. データを貼り付けまたはファイルをドロップ —— ツールは入力フォーマットを自動検出(必要なら上書き可能)。
  3. 出力フォーマットを選ぶ:JSON、YAML、XML、CSV。
  4. オプションを調整
    • インデント:2 スペース、4 スペース、タブ、コンパクト
    • 型推論(CSV → JSON):文字列「123」を数値 123 に変換?
    • XML スタイル:プロパティとしての属性、Mozilla の xml2json 規約、または独自のマッピング
    • CSV 区切り文字:カンマ、セミコロン(欧州ロケール)、タブ、パイプ
    • エンコーディング:UTF-8、UTF-16、ASCII
  5. 変換 —— 結果がプレビューに現れる。
  6. コピーまたはダウンロード

サイドパネルは並べてラウンドトリップ検証を表示:JSON → YAML → JSON を実行、両方の JSON が深く等しいなら、変換は損失なし。違いの場合、構造化 diff ビューが何が失われたかを示す(コメント、順序、null タイピング)。

すべてがブラウザで実行 —— データはサーバーにアップロードされません。すべての 4 フォーマット用の参照パーサー / シリアライザを使用:JSON 用ネイティブ、YAML 用 js-yaml、XML 用 fast-xml-parser、CSV 用 papaparse

方法 2:jq + yq + xq + csvjson(コマンドライン勝者)

スクリプタブル / 反復作業用、CLI コンビが勝つ:

# JSON → YAML
cat data.json | yq -P > data.yaml

# YAML → JSON
cat config.yaml | yq -o=json > config.json

# JSON → CSV(フラット object のみ)
cat data.json | jq -r '(.[0] | keys) as $keys | $keys, (.[] | [.[ $keys[] ]])[] | @csv'

# XML → JSON
cat document.xml | xq -j > document.json

# CSV → JSON
cat data.csv | csvjson > data.json

jq は事実上の標準 JSON プロセッサ —— マイナーな構文癖を超えるすべての DevOps エンジニアによって愛されています。yq は YAML 用 jq;xq は XML 用;csvjson は最も簡単な CSV → JSON ツール。CI、シェルスクリプト、迅速な調査クエリ用にこれらを使用。

方法 3:Pandas(データ分析が変換に出会う)

レポートまたは分析のために大きいデータセットを変換しているなら、Pandas はすべての 4 フォーマットを読み書きします:

import pandas as pd

# JSON → CSV
df = pd.read_json('data.json')
df.to_csv('data.csv', index=False)

# CSV → JSON(型推論付き)
df = pd.read_csv('data.csv')
df.to_json('data.json', orient='records', indent=2)

# XML → CSV
df = pd.read_xml('data.xml')
df.to_csv('data.csv', index=False)

Pandas は強力ですが、依存関係(Python + Pandas、〜50 MB)と学習曲線が伴います。一度きりまたは時々の変換には、ブラウザ / CLI ツールが速い。本格的なデータパイプライン(10k+ 行)には、Pandas のメモリ効率とベクトル化された操作が勝つ。

方法 4:API(プログラム的変換)

サービスの一部としてのプログラム的変換用、各言語のスタックには参照ライブラリがあります:

// Node.js
import yaml from 'js-yaml';
import { XMLParser, XMLBuilder } from 'fast-xml-parser';
import Papa from 'papaparse';

const yamlStr = yaml.dump(jsonObj);
const xmlObj = new XMLParser().parse(xmlStr);
const csv = Papa.unparse(jsonArray);
# Python
import json, yaml, xmltodict, csv

with open('config.yaml') as f:
    data = yaml.safe_load(f)

json.dumps(data, indent=2)
xmltodict.unparse(data)

セキュリティに敏感なソースからのデータを処理しているなら、常にストリクトモードのパーサーを使用:

  • YAMLyaml.safe_loadyaml.load ではない)—— !!python/object/apply:os.system のような任意の Python object 構築を防ぐ
  • XML:XXE と enttities を解決しないパーサーを使用(XML 外部エンティティ攻撃 —— <!ENTITY xxe SYSTEM "file:///etc/passwd"> は信頼できない XML を介して任意のファイル読み取り)
  • JSON:通常安全だが、__proto__ キーは攻撃に悪用される可能性のあるプロトタイプ汚染を引き起こせる(モダン Node ランタイムは緩和、それでもユーザー入力からのこれらのキーを拒否)

ラウンドトリッピング:1 つのデータセット、4 つのフォーマット

実用例 —— 同じ「ユーザー」レコードが 4 つのフォーマットでどう見えるか:

JSON

{
  "users": [
    { "id": 1, "name": "Alice", "active": true, "tags": ["admin", "early-adopter"] },
    { "id": 2, "name": "Bob", "active": false, "tags": [] }
  ]
}

YAML(同じデータ、コメント可、より読みやすい):

users:
  # 管理者ユーザーが最初
  - id: 1
    name: Alice
    active: true
    tags:
      - admin
      - early-adopter
  - id: 2
    name: Bob
    active: false
    tags: []

XML(同じデータ、より冗長、属性 vs 子要素の選択):

<users>
  <user id="1" active="true">
    <name>Alice</name>
    <tags>
      <tag>admin</tag>
      <tag>early-adopter</tag>
    </tags>
  </user>
  <user id="2" active="false">
    <name>Bob</name>
    <tags/>
  </user>
</users>

CSV(同じデータ、フラット化された、ネストは特別な処理が必要):

id,name,active,tags
1,Alice,true,"admin,early-adopter"
2,Bob,false,

CSV では、「tags」アレイは引用文字列としてエンコードする必要があり、すべての消費者は同じ方法で解析されるとは仮定できません。本物のリレーショナルデータ(ネスト、変数長)には、CSV は厳格 raw か別個の参照テーブルを必要とします。

落とし穴チェックリスト

型強制 (CSV → JSON):「100」、「3.14」、「TRUE」、「2026-01-15」のような値は、ツールが推論を有効にしていれば自動的に変換されます。電話番号 ("4155551234"4155551234 、先頭ゼロを失う) と国コード ("01"1) を破ります。プログラム的に進むときは、明示的なスキーマを使用、推論ではなく。

Unicode と BOM:CSV ファイルは bytes 0xEF 0xBB 0xBF(UTF-8 BOM)で始まる場合があります。一部のパーサーはそれらをスキップ、他はそれらを最初のセルの一部にします。Excel 互換性のために、UTF-8 出力で BOM を保持;プログラム的消費のために、ストリップ。

ロケール区切り文字:欧州ロケール(ドイツ、フランス、イタリア)は CSV 区切り文字としてセミコロン(;)を使用、カンマは小数点。米国スタイル CSV を欧州 Excel で開くと、すべてが 1 つのカラムに着地。クロスロケール変換のための区切り文字を明示的に設定。

XXE 攻撃 (XML):信頼できない XML には、外部エンティティを解決しないパーサーを使用。テストインジェクション:<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><foo>&xxe;</foo>。ハードンされたパーサーで、これは静かに失敗するべきです;ナイーブなものでは、/etc/passwd の内容が返されます。

プロトタイプ汚染 (JSON):信頼できない JSON object のキーが __proto__constructor、または prototype の場合、ナイーブな Object.assign または再帰マージは JavaScript ランタイム全体を汚染できます。モダン Node 22+ はデフォルトでこれをブロックしますが、明示的な拒否リストでより安全。

YAML 数値型推論version: 1.10 は YAML で float 1.1 として解析(末尾ゼロ落とす)。「1.10」(文字列)を文字通り意味するなら、引用:version: "1.10"

ツールボックスをどう構築したか(技術的ディープダイブ)

Ai2Done Format Converter は以下に構築されています:

  • 各フォーマット用の参照パーサー:JSON.parse / JSON.stringify(ネイティブ)、js-yaml(YAML 用、〜30 KB gzipped)、fast-xml-parser(XML 用、〜25 KB gzipped)、papaparse(CSV 用、〜10 KB gzipped)
  • 一般的な木表現に基づいて任意の 2 フォーマット間で変換する統一中間 AST
  • ストリクトモード SafeSchema デフォルトですべての YAML 解析用(カスタムタグなし、Python object 構築なし)
  • XML を読むときに外部エンティティ解決を無効に(XXE 保護)
  • エンコーディング検出と適切な BOM 処理:UTF-8、UTF-16 LE/BE、ASCII

興味深いデザインの選択:ラウンドトリップ検証としてのデフォルトディスプレイモード。「JSON を YAML に変換」をクリックすると、当社のツールは YAML を JSON に逆変換し、両方の JSON object を深く等しいか比較します。等しくなければ、何が失われたかを示す警告を表示します(「コメントが落とされた」「object キー順序が変更」「XML 属性が @-接頭辞付き JSON プロパティになった」)。これはあなたが本番にコミットする前に変換損失をキャッチするための主要ガードレールです。

FAQ

Q: 私には機密データがあります —— 変換中にどこにも送信されないことをどう知れますか? A: Ai2Done Format Converter はブラウザ DevTools の Network タブで(変換時にネットワークリクエストなし)、または Wi-Fi をオフにして再試行することで(接続なしで完全に動作)検証できます。すべての変換は WebAssembly でロードされたパーサーを使用してブラウザ JavaScript で実行されます。

Q: それを使い続けるとき、YAML がアルファベット順に object キーをソートするのはなぜですか? A: それは仕様です。YAML 1.2 はマッピングを順序付きで定義しますが、ほとんどのパーサー(js-yaml を含む)は順序を放棄するハッシュテーブルとして解析。{kv: true} フラグで js-yaml から dump を使用して順序を保存できますが、結果の YAML は一部の他のツールで読みにくくなります。

Q: 巨大な CSV ファイル(100MB+)を変換できますか? A: 変換器はブラウザメモリプレッシャーのため〜50 MB でキャップ。10k+ 行を変換しているなら、CLI ツール(csvjson、Pandas)または Apache Arrow パイプラインを使用 —— ストリーミングデコーディングでより効率的。

Q: なぜ「変換」ボタンが「美しい印刷」もしますか? A: それは時々混乱を引き起こします。改善するには、コンパクトな再シリアル化を強制する コンパクトモード(出力の右上)に切り替え、または不要な空白を保持。

Q: CSV ヘッダーに重複があります —— 何が起こりますか? A: ほとんどの JSON 出力は重複ヘッダーを最後勝ち(最後のカラムが他のすべてを上書き)として扱います。当社の変換器はそれを警告として表示し、重複ヘッダーを suffixed する(namename_1name_2)か上書きを許可するかを尋ねます。

Q: 「インデント無効化」または「コンパクト出力」は何を意味しますか? A: コンパクトモードはすべての空白(インデント、改行)を削除して、最小バイトサイズに対して。プログラム的消費(API レスポンス、データベース blob)には良い —— 人間にとってひどい。デバッグ可能なファイルには、インデントオンを保つ。

今試す

並べて検証で 4 つのフォーマット間で変換:

Format Converter を開く →

ペースト、選ぶ、ダウンロード。アップロードなし、サインアップなし、データはブラウザに留まります。

関連読み物


最終更新 2026-06-14。Format Converter はブラウザで 100% 動作 —— データはデバイスを離れません。私たちのサーバーログには変換したものは含まれません。