MYMONDAY.ai
서비스스튜디오도구데이터·포맷73CSS 생성기19색상·이미지10인코딩·보안10웹·SEO11개발·데브옵스10파일·내보내기18계산기6가이드

JSON을 XML로 변환

어떤 JSON 값이든 요소만으로 이루어진 XML 문서로 바꾸고, 루트 이름·배열 항목 이름·들여쓰기를 직접 정합니다.

  • 브라우저에서 처리
  • 가입 없음
  • 무료

도구 작업 공간

예제

옵션

들여쓰기

JSON 입력

27줄435byte

결과

⌘/Ctrl + Enter로 복사
결과 · data.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <id>4821</id>
  <status>shipped</status>
  <customer>
    <id>77</id>
    <name>Ada Lovelace</name>
    <email>ada@example.com</email>
    <vip>true</vip>
  </customer>
  <items>
    <item>
      <sku>KB-100</sku>
      <name>Keyboard</name>
      <qty>1</qty>
      <price>49.9</price>
    </item>
    <item>
      <sku>MS-220</sku>
      <name>Mouse</name>
      <qty>2</qty>
      <price>19</price>
    </item>
  </items>
  <total>87.9</total>
  <shipped_at>2026-03-14T09:30:00Z</shipped_at>
  <tracking/>
</root>
요소22
크기565byte

JSON XML 변환기는 어떤 JSON 값이든 UTF-8 XML 문서로 써 줍니다. 객체 키는 요소 이름이, 스칼라 값은 텍스트 내용이 되고, 전체 트리는 이름을 직접 정하는 루트 요소 아래에 놓입니다. 배열 항목에 쓸 요소 이름과 들여쓰기(2칸, 4칸, 탭)를 고르고 <?xml ...?> 선언을 끌 수도 있습니다.

JSON에는 XML 속성이나 혼합 콘텐츠에 해당하는 개념이 없어서 변환 규칙은 일부러 단순합니다. 모든 키는 속성이 아니라 요소가 됩니다. SOAP 스타일 페이로드, 설정 파일, 요소만 있는 문서가 필요한 통합 테스트에는 충분하지만 속성에 의존하는 형식에는 맞지 않습니다.

변환은 브라우저 안에서 이루어집니다. 200,000자를 넘는 입력은 Web Worker에서 처리하고 1,000,000자를 넘으면 편집기에서 원문을 숨기되 전체를 변환합니다. 한도는 20 MiB, 중첩 300단계입니다.

사용 방법

  1. JSON 붙여넣기

    객체, 배열, 단일 문자열이나 숫자까지 유효한 JSON이면 무엇이든 붙여넣습니다. 샘플 메뉴에서 API 응답, 중첩 배열, 경계 사례를 불러올 수 있습니다.

  2. 루트와 항목 이름 정하기

    루트 요소 이름과 배열 항목마다 쓸 이름(기본값 item)을 입력합니다. 둘 다 올바른 XML 이름이어야 하고 대소문자와 관계없이 xml로 시작할 수 없으며, 항목 이름을 비우면 item이 쓰입니다.

  3. 들여쓰기와 선언 선택

    2칸, 4칸, 탭 중에서 고르고, 다른 문서에 끼워 넣을 때처럼 XML 선언이 필요 없으면 끕니다.

  4. 문서와 알림 확인

    배열이 반복되는 항목 요소로 바뀐 모습과 특이한 키가 인코딩된 모습을 확인합니다. 제어 문자를 바꿔야 했다면 알림이 나오고, 루트 이름이 잘못됐거나 중첩이 300단계를 넘으면 오류가 납니다.

  5. 복사 또는 저장

    XML을 복사하거나 파일로 저장합니다.

작동 원리

JSON이 요소로 바뀌는 방식

객체는 키마다 자식 하나를 가진 요소가 됩니다. 배열은 항목마다 자식 하나를 가진 요소가 되고 자식 이름은 항목 옵션이 정하므로, 기본값에서는 배열 자신의 키가 컨테이너이고 항목은 모두 item입니다. 스칼라는 String()으로 바뀌고 이스케이프되며, null과 {}, []는 <n/> 같은 빈 태그가 됩니다.

타입 정보는 남지 않습니다. 숫자 3, 문자열 "3", 불리언 true가 모두 같은 텍스트로 나오므로 읽는 쪽에는 구분할 스키마나 약속이 필요합니다.

JSONXML
객체키마다 자식 요소가 하나씩 있는 요소
배열<item> 자식이 반복되는 요소
문자열, 숫자, 불리언이스케이프된 텍스트 내용
null빈 태그 <key/>
{} 또는 []빈 태그 <key/>
최상위 스칼라루트 요소 안의 텍스트

이스케이프와 유효한 이름

텍스트에서는 &가 &amp;, <가 &lt;, >가 &gt;로 바뀝니다. 따옴표는 요소 내용에서 이스케이프가 필요 없어 그대로 씁니다. XML 1.0은 대부분의 제어 문자를 엔티티로도 담지 못하므로 해당 문자는 U+FFFD로 바꾸고 알림에 개수를 알려 줍니다.

요소 이름은 XML Name 규칙을 따라야 합니다. 첫 글자는 문자나 밑줄, 이후는 문자, 숫자, 점, 하이픈, 밑줄입니다. 키의 그 밖의 문자는 _x, 16진수 코드 포인트, _ 순서로 써서 first name은 first_x20_name, a:b는 a_x3a_b가 됩니다. 그래도 숫자나 XML 사양이 예약한 xml로 시작하는 이름은 앞에 밑줄이 붙고, 빈 키는 _가 됩니다.

first name -> first_x20_name
@id        -> _x40_id
1st        -> _1st
xml        -> _xml

실제 예시

이스케이프, 배열, null, 빈 값
입력
{"user":{"name":"Ada & <Bo>","tags":["a","b"],"n":null,"empty":{},"count":3,"ok":true}}
출력
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <user>
    <name>Ada &amp; &lt;Bo&gt;</name>
    <tags>
      <item>a</item>
      <item>b</item>
    </tags>
    <n/>
    <empty/>
    <count>3</count>
    <ok>true</ok>
  </user>
</root>

텍스트는 이스케이프되고, 배열의 원소는 각각 item 요소가 되며, null과 빈 객체는 빈 태그로 쓰입니다.

XML 이름으로 쓸 수 없는 키
입력
{"1st":1,"first name":"x","xml":2,"a:b":3,"@id":4,"é":5}
출력
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <_1st>1</_1st>
  <first_x20_name>x</first_x20_name>
  <_xml>2</_xml>
  <a_x3a_b>3</a_x3a_b>
  <_x40_id>4</_x40_id>
  <é>5</é>
</root>

유효하지 않은 문자는 _x, 16진수 코드, 밑줄로 바뀌고, 숫자나 xml로 시작하는 이름은 앞에 밑줄이 붙으며, é 같은 글자는 유효하므로 그대로 남습니다.

사용자 지정 이름을 쓴 최상위 배열
입력
[1,{"a":[2]}]
출력
<list>
	<entry>1</entry>
	<entry>
		<a>
			<entry>2</entry>
		</a>
	</entry>
</list>

루트는 list, 항목 이름은 entry, 들여쓰기는 탭, 선언은 없음입니다. 최상위 배열에는 원소 이름을 정해 줄 키가 없어서 원소마다 루트의 entry 자식이 됩니다.

제어 문자 대체
입력
{"s":"a\u0001b \"q\""}
출력
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <s>a�b "q"</s>
</root>

U+0001은 XML 1.0에서 허용되지 않아 U+FFFD로 바뀌고 알림이 개수를 알려 줍니다. 따옴표는 요소 내용에서 이스케이프가 필요 없습니다.

문자열 하나와 사용자 지정 루트
입력
"hi"
출력
<?xml version="1.0" encoding="UTF-8"?>
<greeting>hi</greeting>

스칼라 문서도 받아서 지정한 루트 요소 안에 넣습니다.

자주 하는 실수

  • 원래 키 이름이 바뀔 수 있습니다

    first_x20_name으로 바뀐 키는 원래 그렇게 쓴 키와 구분할 수 없습니다. 실제 키에 든 밑줄과 x는 이스케이프되지 않기 때문입니다. 받는 쪽이 원래 이름을 필요로 하면 공백이나 구두점이 든 키를 피하세요.

  • 속성은 만들 수 없습니다

    모든 것이 요소입니다. 대상 스키마가 <user id="1"> 형태를 기대하면 XML을 후처리하거나 변환 도구로 만들어야 합니다.

  • 배열 항목은 모두 같은 이름을 씁니다

    항목 이름을 바꾸지 않으면 사용자 목록은 <users><item>...</item></users>가 되고, 지정한 이름 하나가 문서의 모든 배열에 적용됩니다. <users> 아래 <user>를 기대하는 스키마에는 후처리가 필요합니다.

  • 타입이 사라집니다

    숫자, 불리언, 문자열은 모두 텍스트이고 null은 빈 객체나 빈 배열과 같은 모양입니다. 빈 문자열은 <n></n>로 쓰이는데 파서는 같은 빈 요소로 읽습니다. 별도의 규칙 없이는 JSON으로 되돌릴 수 없습니다.

  • 잘못된 루트·항목 이름은 거부됩니다

    1bad나 XmlData 같은 이름은 루트와 항목 요소 모두에서 거부됩니다. 문자나 밑줄로 시작하고 xml로 시작하지 않는 이름을 쓰세요.

  • 너무 깊은 문서는 실패합니다

    중첩이 300단계를 넘으면 출력 대신 오류가 납니다.

자주 묻는 질문

XML 선언이 포함되나요?

기본값은 포함이라 출력이 <?xml version="1.0" encoding="UTF-8"?>로 시작합니다. XML 선언 스위치를 끄면 빠집니다.

XML 속성으로 출력할 수 있나요?

아니요. 모든 JSON 키는 자식 요소가 됩니다.

배열은 어떻게 표현되나요?

배열마다 요소 하나가 만들어지고 항목마다 자식이 하나씩 들어갑니다. 이름은 배열 항목 요소 옵션을 바꾸지 않으면 item입니다.

null은 어떻게 되나요?

<note/> 같은 빈 태그가 됩니다. 빈 문자열은 <note></note>로 쓰이는데 XML 파서는 같은 빈 요소로 읽으므로 파싱 뒤에는 둘을 구분할 수 없습니다.

최상위 배열도 변환되나요?

네. 배열 원소가 지정한 루트 요소의 item 자식이 됩니다.

XML 이름으로 쓸 수 없는 키는 어떻게 되나요?

유효하지 않은 문자마다 _x, 16진수 코드, _로 바꾸고, 숫자나 xml로 시작할 이름에는 앞에 밑줄을 붙이므로 키가 사라지거나 합쳐지지 않습니다.

루트와 항목 이름으로 무엇을 쓸 수 있나요?

대소문자와 관계없이 xml로 시작하지 않는 올바른 XML 이름이면 됩니다. root, response, entry, _data 등입니다.

데이터가 어딘가로 전송되나요?

아니요. 변환은 브라우저 안에서 실행되며 업로드되지 않습니다.

마지막 업데이트: