JSON to XML 변환기
JSON을 XML 형식으로 변환
JSON 입력
XML 출력
JSON to 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 to XML 변환기가 수동 재구성 없이 변환을 처리합니다. 변환은 예측 가능한 매핑 규칙을 따릅니다. JSON 객체는 XML 요소가 되고, 배열 항목은 반복되는 형제 요소가 되며, 기본 값은 텍스트 노드가 됩니다.
JSON이 XML에 어떻게 매핑되는지를 정의하는 단일 RFC나 W3C 표준은 존재하지 않습니다. 라이브러리마다 동일한 입력에 대해 서로 다른 출력을 생성합니다. 가장 일반적인 관례(이 도구가 사용하는 방식)는 전체 문서를 설정 가능한 루트 요소로 감싸고, 각 JSON 키를 XML 자식 요소로 변환하며, 배열 항목을 동일한 태그 이름의 반복 요소로 표현합니다. 수신 시스템이 특정 XML 스키마(XSD)를 강제하는 경우 이 매핑 규칙을 이해하는 것이 중요합니다.
온라인 JSON to XML 변환기를 사용하는 이유
JSON 소스를 바탕으로 XML을 직접 작성하는 것은 번거롭고 오류가 발생하기 쉽습니다. 태그 불일치, 닫는 요소 누락, 잘못된 중첩은 스키마 검증에 실패하는 문서를 만들어냅니다. 변환기는 구조적 변환을 자동으로 처리합니다.
JSON to XML 활용 사례
JSON to XML 매핑 규칙
JSON-to-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) |
코드 예제
아래는 세 가지 환경에서 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>
// → ...
}