JSONからXMLコンバーター
JSONをXML形式に変換
JSON入力
XML出力
JSONからXMLへの変換とは?
JSON(JavaScript Object Notation)とXML(eXtensible Markup Language)は、ソフトウェア開発における2大データ交換フォーマットです。JSONはコンパクトな構文でキーと値のペアおよび配列を使用し、XMLは開始タグと終了タグでデータを囲みオプションの属性を持ちます。JSONをXMLに変換するということは、JSONの構造的な基本要素(オブジェクト、配列、文字列、数値、真偽値、null)を、要素のネストが対応した整形式のXMLドキュメントに変換することを意味します。
XMLは、多くのエンタープライズシステム、政府系API、SOAPウェブサービス、HL7(医療)、FpML(金融)、XBRL(財務報告)などの業界標準において必須のフォーマットです。アプリケーションがJSONを出力し、後続のシステムがXMLを要求する場合、JSONからXMLへのコンバーターが手動での再構築なしに変換を担います。変換は予測可能なマッピングルールに従います。JSONオブジェクトはXML要素になり、配列の各アイテムは繰り返しの兄弟要素になり、プリミティブ値はテキストノードになります。
JSONとXMLのマッピング方法を定義するRFCやW3C標準は存在しません。そのため、異なるライブラリは同じ入力に対して異なる出力を生成します。最も一般的な規約(このツールが採用するもの)は、ドキュメント全体を設定可能なルート要素で囲み、各JSONキーをXMLの子要素に変換し、配列アイテムを同じタグ名の繰り返し要素として表現します。受信システムが特定のXMLスキーマ(XSD)を強制する場合、これらのマッピングルールを理解することが重要です。
オンラインJSONからXMLコンバーターを使う理由
JSONソースから手作業でXMLを記述することは、手間がかかりエラーが生じやすい作業です。タグの不一致、終了要素の忘れ、誤ったネストは、スキーマ検証に失敗するドキュメントを生成します。コンバーターは構造的な変換を自動的に処理します。
JSONからXML変換のユースケース
JSONからXMLへのマッピングルール
JSONからXMLへの変換を規定する統一標準は存在しないため、ツールによって出力が異なります。以下の表は、このコンバーターおよび主要ライブラリ(js2xmlparser、xmlbuilder、fast-xml-parser)が使用するマッピング規約を示しています。配列の繰り返し兄弟要素という規約が主流になったのは、XMLスキーマがコレクションを自然にモデル化する方法(各アイテムが独立した要素)を反映し、XPathクエリやXSLTトランスフォームとシームレスに統合できるためです。
| JSON Type | JSON Example | XML Output |
|---|---|---|
| Object | {"name": "Alice"} | <name>Alice</name> |
| Nested object | {"user": {"age": 30}} | <user><age>30</age></user> |
| Array | {"colors": ["red", "blue"]} | <colors>red</colors><colors>blue</colors> |
| String | "hello" | <root>hello</root> |
| Number | 42 | <root>42</root> |
| Boolean | true | <root>true</root> |
| Null | null | <root/> |
| Empty object | {} | <root/> |
| Empty array | [] | (no child elements) |
コード例
以下は3つの環境でJSONをXMLに変換する実行可能なコード例です。各例はサンプルのJSONオブジェクトから整形式のXMLを生成します。
import { create } from 'xmlbuilder2';
const json = {
order: {
id: 1024,
items: [
{ sku: "A1", qty: 2 },
{ sku: "B3", qty: 1 }
],
shipped: false
}
};
const xml = create({ version: '1.0' })
.ele(json)
.end({ prettyPrint: true });
console.log(xml);
// → <?xml version="1.0"?>
// → <order>
// → <id>1024</id>
// → <items>
// → <sku>A1</sku>
// → <qty>2</qty>
// → </items>
// → <items>
// → <sku>B3</sku>
// → <qty>1</qty>
// → </items>
// → <shipped>false</shipped>
// → </order>import json
import xmltodict
data = {
"order": {
"id": 1024,
"items": [
{"sku": "A1", "qty": 2},
{"sku": "B3", "qty": 1}
],
"shipped": False
}
}
# xmltodict.unparse expects a single root key
xml = xmltodict.unparse(data, pretty=True)
print(xml)
# → <?xml version="1.0" encoding="utf-8"?>
# → <order>
# → <id>1024</id>
# → <items>
# → <sku>A1</sku>
# → <qty>2</qty>
# → </items>
# → <items>
# → <sku>B3</sku>
# → <qty>1</qty>
# → </items>
# → <shipped>false</shipped>
# → </order>package main
import (
"encoding/json"
"encoding/xml"
"fmt"
)
type Item struct {
SKU string `json:"sku" xml:"sku"`
Qty int `json:"qty" xml:"qty"`
}
type Order struct {
XMLName xml.Name `xml:"order"`
ID int `json:"id" xml:"id"`
Items []Item `json:"items" xml:"items"`
Shipped bool `json:"shipped" xml:"shipped"`
}
func main() {
raw := `{"id":1024,"items":[{"sku":"A1","qty":2},{"sku":"B3","qty":1}],"shipped":false}`
var order Order
json.Unmarshal([]byte(raw), &order)
out, _ := xml.MarshalIndent(order, "", " ")
fmt.Println(xml.Header + string(out))
// → <?xml version="1.0" encoding="UTF-8"?>
// → <order>
// → <id>1024</id>
// → <items>
// → <sku>A1</sku>
// → <qty>2</qty>
// → </items>
// → ...
}