JSON to XML 변환 도구
JSON to XML 변환이란?
JSON to XML 변환은 JSON(JavaScript Object Notation) 데이터를 XML(eXtensible Markup Language) 형식으로 변환하는 것입니다. 서로 다른 데이터 형식을 사용하는 시스템 통합, 레거시 XML API 작업, 설정 파일, 데이터 교환 또는 문서 저장에 XML이 필요할 때 유용합니다. 배열, 숫자 타입, 빈 값, 속성 표현처럼 JSON과 XML의 구조 차이가 있는 항목은 변환 규칙을 확인해야 하며, 실제 시스템 연동 전 샘플 데이터로 검증하는 것이 안전합니다.
사용 방법
사용 방법
- 왼쪽 입력란에 JSON 데이터를 붙여넣거나 입력하세요
- 선택적으로 루트 요소 이름을 사용자 지정하세요
- 들여쓰기 크기를 선택하세요 (2칸, 4칸 또는 Tab)
- 변환된 XML이 오른쪽에 구문 강조와 함께 표시됩니다
- 복사 또는 다운로드를 클릭하여 결과를 저장하세요
변환 확인사항
- 변환 후 배열, null 값, 속성 유사 필드를 검토하세요. JSON과 XML은 데이터를 완전히 같은 방식으로 모델링하지 않습니다.
- XML을 API 요청, 구성 파일 또는 테스트 픽스처에 복사하기 전에 안정적인 루트 요소 이름을 선택하세요.
활용 사례
기술 원리
JSON(RFC 8259, JavaScript 객체 리터럴에서 파생)과 XML(W3C XML 1.0, 1998년 제정)은 모두 트리 구조의 직렬화 형식이지만 문법이 다릅니다. JSON에는 객체(문자열 키를 가진 키/값 맵), 배열(순서 있는 목록), 6가지 스칼라 타입(문자열, 숫자, 불리언, null, 구조 타입)이 있습니다. XML에는 요소(시작/종료 태그 쌍으로 텍스트나 하위 요소를 감싸는 것), 속성(시작 태그의 이름/값 쌍), 텍스트 노드, 주석, 처리 지시문, CDATA 섹션이 있습니다. 변환은 표준 답이 없는 구조적 변환이며, 기존의 모든 규칙(BadgerFish, JSONML, SOAP/RPC 인코딩, OOXML의 평면 스키마, XBRL의 linkbase 형식)은 같은 입력에 대한 서로 다른 규칙입니다.<br /><br />'속성 대 하위 요소' 결정이 핵심 모호성입니다. JSON의 유일한 메타데이터는 키 이름에 존재하므로, `{"id": "42", "name": "Alice", "admin": true}` 같은 JSON 객체는 어떤 키가 '메타데이터'이고 어떤 키가 '데이터'인지 명시하지 않습니다. 세 가지 일반적인 규칙: (1) 이 페이지의 기본값 — 스칼라는 텍스트 콘텐츠가 되고, 중첩 속성 백(값이 모두 스칼라인 배열이 아닌 객체로 인식)의 원래 JSON 키는 `@` 접두사가 붙은 XML 속성이 됩니다(BadgerFish 규칙). (2) JSONML — 모든 JSON 객체는 'tag' 키를 요소 이름으로, 'attr' 키를 속성 맵으로, 하위 항목을 자식으로 가지는 요소가 됩니다. (3) oData/Atom — JSON 객체는 요소가 되고 배열은 배열 이름 래퍼 요소로 인라인됩니다. 각 규칙은 특정 다운스트림 소비자에게는 증명 가능하게 올바르고 다른 소비자에게는 증명 가능하게 틀리기 때문에, XML 변환기가 보편적으로 수락된 적이 없습니다.<br /><br />배열은 두 번째 모호성입니다. JSON 배열은 순서 있는 목록이고, XML에는 네이티브 배열 타입이 없습니다. 세 가지 표준 해결책: (a) 하위 요소를 반복(이 페이지의 기본값, OOXML/SOAP 규칙): `[1, 2, 3]` → `<root><item>1</item><item>2</item><item>3</item></root>`. (b) 컨테이너로 래핑: `<root><items><item>1</item>...</items></root>`. (c) 배열을 단일 구분 문자열로 인코딩하고 구분자를 문서화(CSV-in-XML, 소비자가 파싱할 때만). 각각은 다른 다운스트림 XSD에 대해 올바르며, 변환 단계는 어떤 것을 출력할지 알아야 합니다.<br /><br />XML 요소 이름은 유효한 QName 토큰이어야 합니다(XML 1.0 §2.3 / XML Namespaces 1.0 §3): 문자, 밑줄 또는 콜론으로 시작한 다음 문자, 숫자, 하이픈, 밑줄, 마침표 또는 콜론이 옵니다. JSON은 '123'이나 'first name' 같은 키를 허용하는데 이것이 이를 위반합니다 — 변환기는 이름을 변경(slugify하여 first_name으로, _ 접두사 추가)하거나 실패해야 합니다. JSON 문자열 콘텐츠도 요소 텍스트와 속성 값에서 엔티티 이스케이프가 필요합니다: `&` → `&`, `<` → `<`, `>` → `>`(오래된 XML의 텍스트에서만 필수이지만 항상 안전), `"` → `"`, `'` → `'`(속성에서), 인코딩 범위 밖의 문자는 `&#xHHHH;`로 표현합니다. 5가지 내장 엔티티와 숫자 문자 참조는 XML에서 필수이며, HTML의 추가 명명 엔티티(` `, `©`)는 일반 XML에서 정의되지 않으므로 사용하려면 명시적 DOCTYPE이 필요합니다.<br /><br />출력 문서에는 프롤로그와 네임스페이스 선언도 필요합니다: `<?xml version="1.0" encoding="UTF-8"?>`가 먼저 오고, 그 다음에 xmlns 선언이 옵니다. 대상 시스템이 네임스페이스를 사용하면(SOAP는 `http://www.w3.org/2003/05/soap-envelope`, XSLT는 `http://www.w3.org/1999/XSL/Transform`), 접두사 매핑은 루트 요소의 `xmlns:prefix="uri"` 속성으로 추가됩니다. JSON에는 네임스페이스 개념이 없으므로 사용할 URI의 선택은 프로젝트별입니다. 빈 값의 경우, JSON null은 일반적으로 `<key xsi:nil="true"/>`(XML 스키마 규칙) 또는 `<key></key>`(빈 요소 규칙)로 표현됩니다. 변환기는 하나를 선택하며, 정답은 소비자의 XSD 검증에 따라 다릅니다.<br /><br />역방향(XML → JSON)의 경우, 같은 모호성이 반대로 적용됩니다: 속성은 BadgerFish에서 `@attributes` 키로 매핑되고, CDATA는 `$` 또는 `#text` 키로 매핑되며, 혼합 콘텐츠 요소(텍스트 + 하위 요소가 교차)는 깔끔한 JSON 표현이 없어 보통 문자열 연결로 출력됩니다. 실전 변환기는 항상 '속성 키', '텍스트 키', '배열 래퍼' 옵션을 노출합니다 — 이를 피할 방법은 없습니다.
- JSON(RFC 8259)과 XML(W3C XML 1.0, 1998년)은 모두 트리 구조의 직렬화 형식이며, 변환은 표준 답이 없는 구조적 변환이므로 같은 입력에 대해 여러 규칙(BadgerFish, JSONML, SOAP, OOXML)이 공존합니다.
- 속성 대 하위 요소: 스칼라는 기본적으로 텍스트 콘텐츠가 되고, 중첩 속성 백 객체(값이 모두 스칼라)는 @ 접두사 속성이 됩니다(BadgerFish). JSONML은 'tag'/'attr' 키를 사용하고, oData/Atom은 래퍼 요소를 사용합니다.
- 배열: 이 페이지의 기본값은 하위 요소를 반복하는 것입니다(OOXML/SOAP 규칙). 대안: 컨테이너 요소로 래핑하거나 구분 문자열로 인코딩. JSON의 배열 순서는 XML 출력에서 보존됩니다.
- XML 요소 이름 규칙: 문자, 밑줄 또는 콜론으로 시작해야 하며, 그 다음은 문자/숫자/하이픈/밑줄/마침표/콜론이 옵니다(XML 1.0 §2.3). '123'이나 'first name' 같은 JSON 키는 유효하지 않은 XML 이름이므로 slugify하거나 거부해야 합니다.
- 엔티티 이스케이프: `&` → `&`, `<` → `<`, `>` → `>`, `"` → `"`, `'` → `'`, 기타 인코딩 문자는 `&#xHHHH;`로. 5가지 내장 엔티티는 필수이며, ` ` 같은 HTML 추가 항목은 명시적 DOCTYPE이 필요합니다.
- 문서 프롤로그: `<?xml version="1.0" encoding="UTF-8"?>`이 표준 첫 줄입니다. 루트 요소의 xmlns 선언이 네임스페이스 접두사를 선언하며, JSON에는 네임스페이스 개념이 없으므로 변환기가 프로젝트별로 선택합니다.
- JSON null → XML: `<key xsi:nil="true"/>`(XML 스키마 규칙) 또는 `<key></key>`(빈 요소). 선택은 소비자의 XSD와 일치해야 하며, 그렇지 않으면 검증이 실패합니다.
- 역방향 XML → JSON에도 같은 모호성이 있습니다: CDATA 섹션은 `$` 또는 `#text` 키가 되고(BadgerFish), 혼합 콘텐츠 요소(텍스트 + 하위 요소가 교차)는 깔끔한 JSON 형태가 없어 보통 문자열로 연결됩니다.
예시
객체 -> 엘리먼트
{"name": "Alice"}
->
<root>
<name>Alice</name>
</root>배열 -> 엘리먼트
[1, 2, 3]
->
<root>
<item>1</item>
<item>2</item>
<item>3</item>
</root>중첩 구조
{"user": {"name": "Alice", "age": 25}}
->
<root>
<user>
<name>Alice</name>
<age>25</age>
</user>
</root>자주 묻는 질문
변환기는 JSON을 XML로 어떻게 매핑하나요?
각 JSON 객체는 하나의 XML 요소가 됩니다. 객체의 키는 자식 요소 이름이 되고, 원시 값은 요소 텍스트가 됩니다. 배열은 같은 부모 요소를 여러 번 반복하는 형태가 되며, 텍스트의 특수 문자는 이스케이프됩니다(& → &, < → <).
JSON에서 XML로의 변환이 항상 무손실은 아닌 이유가 뭔가요?
JSON에는 number/boolean/null이라는 명시적 타입이 있지만 XML에는 텍스트만 있습니다. JSON은 공백이나 특수 문자가 들어간 키를 허용하지만 XML 요소 이름은 그렇지 않으며, 최상위에 배열이 있어도 XML로는 자연스럽게 옮길 수 없습니다. 이 페이지는 휴리스틱(루트 래퍼 요소, 잘못된 키 정리 등)으로 이러한 간극을 메웁니다.
배열 값은 XML에서 어떻게 표현되나요?
각 배열 요소가 같은 이름의 형제 요소가 됩니다. [{a:1},{a:2}] → <items><item><a>1</a></item><item><a>2</a></item></items>가 되는 식입니다. 래핑 방식은 설정 가능하며, 일부 페이지는 단수형 요소 이름을 직접 지정할 수 있습니다.
유효한 XML 이름이 아닌 JSON 키는 어떻게 되나요?
XML 요소 이름은 숫자로 시작할 수 없고 공백이나 특정 기호를 포함할 수 없습니다. 이 페이지는 잘못된 문자를 밑줄로 바꾸거나 CDATA로 감싸서 정리합니다. 결과는 유효한 XML이지만, 왕복 변환은 정확히 일치하지 않습니다.
JSON의 null과 boolean은 보존되나요?
null은 설정에 따라 빈 요소가 되거나 요소 자체가 생략됩니다. true/false는 그대로 'true' 또는 'false'라는 텍스트가 됩니다. 이런 타입에 대한 XML 표준이 없으므로, 다운스트림 파서가 자체적으로 타입 해석을 적용해야 합니다.
XML 속성도 추가할 수 있나요?
JSON에는 속성 개념이 없어서, 생성기는 기본적으로 모든 것을 요소로 출력합니다. 일부 변환기는 '@id' 같은 특수 키 접두사로 속성을 표시하므로, XML 스키마상 속성 출력이 중요하다면 페이지 옵션을 확인하세요.
변환은 로컬에서 이루어지나요?
네. JSON 파싱과 XML 생성 모두 브라우저 안에서 일어나며, 입력은 업로드되지 않습니다.