مبدل JSON به XML
تبدیل JSON به فرمت XML
ورودی JSON
خروجی XML
تبدیل JSON به XML چیست؟
JSON (JavaScript Object Notation) و XML (eXtensible Markup Language) دو فرمت غالب تبادل داده در توسعه نرمافزار هستند. JSON از جفتهای کلید-مقدار و آرایهها با نحو فشرده استفاده میکند، در حالی که XML دادهها را در تگهای باز و بسته با ویژگیهای اختیاری میپوشاند. تبدیل JSON به XML یعنی ترجمه ساختارهای اولیه JSON — آبجکتها، آرایهها، رشتهها، اعداد، مقادیر بولین و null — به یک سند XML معتبر با تودرتویی عناصر متناظر.
XML در بسیاری از سیستمهای سازمانی، APIهای دولتی، وبسرویسهای SOAP و استانداردهای صنعتی مانند HL7 (بهداشت)، FpML (مالی) و XBRL (گزارشدهی مالی) همچنان فرمت الزامی است. وقتی برنامه شما JSON تولید میکند اما سیستم مقصد XML انتظار دارد، یک مبدل JSON به XML این ترجمه را بدون تغییر دستی ساختار انجام میدهد. تبدیل از قوانین نگاشت قابل پیشبینی پیروی میکند: آبجکتهای JSON به عناصر XML تبدیل میشوند، آیتمهای آرایه به عناصر همرده تکراری، و مقادیر اولیه به گرههای متنی.
هیچ RFC یا استاندارد W3C واحدی وجود ندارد که نحوه نگاشت JSON به XML را تعریف کند. کتابخانههای مختلف برای یک ورودی یکسان خروجی متفاوتی تولید میکنند. رایجترین قرارداد (که این ابزار از آن استفاده میکند) کل سند را در یک عنصر ریشه قابل تنظیم میپوشاند، هر کلید JSON را به یک عنصر فرزند XML تبدیل میکند و آیتمهای آرایه را به عنوان عناصر تکراری با همان نام تگ نشان میدهد. درک این قوانین نگاشت زمانی اهمیت دارد که سیستم دریافتکننده یک XML Schema (XSD) خاص را اعمال میکند.
چرا از یک مبدل آنلاین JSON به XML استفاده کنیم؟
نوشتن XML به صورت دستی از یک منبع JSON خستهکننده و مستعد خطاست. تگهای نامتطابق، عناصر بسته فراموششده و تودرتویی نادرست اسنادی تولید میکنند که اعتبارسنجی schema را شکست میدهند. یک مبدل ترجمه ساختاری را به صورت خودکار انجام میدهد.
موارد استفاده از مبدل JSON به XML
قوانین نگاشت JSON به XML
از آنجا که هیچ استاندارد جهانی بر تبدیل JSON به XML حاکم نیست، ابزارهای مختلف خروجی متفاوتی تولید میکنند. جدول زیر قراردادهای نگاشت مورد استفاده توسط این مبدل و محبوبترین کتابخانهها (js2xmlparser، xmlbuilder، fast-xml-parser) را نشان میدهد. قرارداد عناصر همرده تکراری برای آرایهها غالب شد زیرا همان روشی است که XML schemaها به طور طبیعی مجموعهها را مدل میکنند — هر آیتم یک عنصر درجه اول است نه یک فرزند پوشیده — و به خوبی با کوئریهای 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) |
مثالهای کد
در ادامه قطعه کدهای اجراپذیر برای تبدیل JSON به XML در سه محیط آمده است. هر مثال XML معتبر از یک آبجکت JSON نمونه تولید میکند.
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>
// → ...
}