XML 목록을 JSON Lines로 바꾸는 변환기입니다. 한 줄에 완전한 JSON 값 하나를 담는 이 형식은 BigQuery, jq, Elasticsearch 벌크 로더, 파인튜닝 데이터셋 같은 도구가 레코드를 하나씩 읽을 때 씁니다. 선택한 레코드 경로의 반복 요소 하나가 한 줄이 됩니다. 레코드 경로 선택기가 형제가 반복되는 모든 경로를 행 수와 함께 보여 주고, 자동은 가장 바깥의 경로를 고릅니다.
레코드는 공통 XML 규칙으로 매핑되므로 모든 것을 평평하게 펼치는 CSV와 달리 중첩 요소는 중첩 객체로, 반복 자식은 배열로 남습니다. 레코드 기반 변환기는 속성 접두사가 기본적으로 비어 있어 속성은 평범한 키가 됩니다. 속성과 자식 요소 이름이 겹치면 XML → 데이터 매핑 패널에서 접두사를 지정하세요. 타입 해석은 true, 정수, 소수를 JSON 타입으로 바꿉니다.
XML은 페이지 안의 엄격한 XML 1.0 파서가 읽고 오류는 줄과 열로 표시되며 아무것도 업로드되지 않습니다. 최대 20 MiB를 로컬에서 변환하고 결과를 복사하거나 data.jsonl로 내려받을 수 있습니다.
사용 방법
XML 붙여넣기
문서를 붙여 넣거나 반복 요소가 든 예제를 고르세요. 줄이 바로 나타나고, XML이 올바르지 않으면 첫 문제의 줄과 열이 표시됩니다.
레코드 경로 선택
선택기를 자동(가장 바깥에서 반복되는 요소)으로 두거나
catalog/book같은 다른 경로를 고르세요. 줄 수는 그 경로의 요소 수와 같습니다.매핑 확인
XML → 데이터 매핑 패널에서 속성 접두사나 텍스트 키를 바꾸거나, 모든 값을 문자열로 두려면 타입 해석을 끄세요.
줄 살펴보기
각 줄은 후행 쉼표도 감싸는 배열도 없는 압축된 JSON 객체 하나입니다. 출력 아래 통계에 줄 수가 표시됩니다.
복사 또는 다운로드
줄을 복사하거나 data.jsonl로 내려받으세요. 줄이 서로 독립적이므로 기존 JSONL 데이터셋 뒤에 그대로 이어 붙일 수 있습니다.
작동 원리
JSON Lines 형식
JSON Lines(NDJSON이라고도 함)는 \n으로 구분한 한 줄에 JSON 값 하나를 저장하며 감싸는 배열도 줄 사이 쉼표도 없습니다. 모든 줄이 독립적으로 파싱되므로 읽는 쪽은 거대한 파일을 스트리밍할 수 있고, 한 줄이 실패해도 나머지에 영향이 없으며, wc -l이나 split 같은 일반 텍스트 도구로 파일을 합치거나 나눌 수 있습니다.
출력은 콜론 뒤 공백 없이 압축되고, 줄 구분 문자 U+2028과 U+2029는 \u2028, \u2029로 이스케이프됩니다. 여러 줄 분리 도구가 이 문자를 줄바꿈으로 취급해 레코드 하나를 둘로 쪼개 망가뜨릴 수 있기 때문입니다.
XML 레코드에서 줄로
users/user 같은 레코드 경로는 그 경로의 모든 요소를 선택합니다. 각 요소에 XML 매핑을 적용하여 속성은 키가 되고, 속성이나 자식 옆의 텍스트는 텍스트 키 #text에 들어가며, 반복되는 자식은 배열, 텍스트만 가진 요소는 타입 값이 됩니다. 메타데이터 헤더처럼 경로 바깥의 요소는 빠집니다.
반복되는 요소가 없으면 루트 요소 전체가 유일한 한 줄이 됩니다. 레코드 경로가 텍스트만 가진 요소를 가리키면 각 줄은 객체가 아니라 JSON 문자열이나 숫자 하나입니다.
| XML 레코드 | JSONL 줄 |
|---|---|
| <user id="1" active="true"><name>Ada</name></user> | {"id":1,"active":true,"name":"Ada"} |
| <user id="3"><score>87.25</score></user> | {"id":3,"score":87.25} |
| <tag>new</tag> | "new" |
| <n>007</n> | "007" |
실제 예시
<users>
<user id="1" active="true"><name>Ada Lovelace</name><email>ada@example.com</email><score>98.5</score></user>
<user id="2" active="false"><name>Grace Hopper</name><email>grace@example.com</email><score>91</score></user>
<user id="3" active="true"><name>Linus</name><score>87.25</score></user>
</users>{"id":1,"active":true,"name":"Ada Lovelace","email":"ada@example.com","score":98.5}
{"id":2,"active":false,"name":"Grace Hopper","email":"grace@example.com","score":91}
{"id":3,"active":true,"name":"Linus","score":87.25}자동은 users/user를 고릅니다. 세 번째 줄에는 email 자식이 없었으므로 키가 없고, null 자리표시자도 없습니다.
<users><user id="1" active="true"><name>Ada Lovelace</name></user><user id="2" active="false"><name>Grace Hopper</name></user></users>{"@id":1,"@active":true,"name":"Ada Lovelace"}
{"@id":2,"@active":false,"name":"Grace Hopper"}매핑 패널에서 속성 접두사를 @로 지정하면 속성과 자식 요소가 구분됩니다.
<store><orders>
<order id="1"><tag>new</tag><tag>vip</tag></order>
<order id="3"><tag>bulk</tag></order></orders></store>"new"
"vip"
"bulk"레코드 경로를 store/orders/order/tag로 하면 tag 요소 하나하나가 레코드이고 각 줄은 JSON 문자열 하나입니다. 유효한 JSON Lines입니다.
자주 하는 실수
없는 필드는 null이 아니라 없음
자식이 없는 요소는 그 줄에 키 자체가 없습니다. 하위 스키마가 모든 키를 요구하면 변환 뒤에 빠진 키를 채우세요.
한 개면 객체나 값, 여러 개면 배열
한 파일 안에서
<tag>가 어떤 줄에서는 문자열, 다른 줄에서는 배열일 수 있습니다. 모양을 고정하려면 자식 요소는 항상 배열로를 켜세요. 단, 이 스위치는 단일 스칼라를 포함한 모든 자식 요소를 감쌉니다.경로를 잘못 고르면 거대한 한 줄
반복되는 요소가 없거나 루트를 고르면 문서 전체가 한 줄이 됩니다. 레코드당 한 줄을 얻으려면 반복되는 요소를 고르세요.
숫자는 타입이 바뀜
해석이 켜져 있으면
24.50은24.5가 되고02134는 문자열로 남습니다. 가격, 버전 문자열, 식별자처럼 쓴 글자가 중요하면 해석을 끄세요.주석과 혼합 텍스트는 남지 않음
XML 주석은 버려지고, 자식 요소 사이에 끼어 있던 텍스트는
#text키에 모이므로 문단 안의 순서가 사라집니다.
자주 묻는 질문
JSONL과 NDJSON은 무엇이 다른가요?
실무에서는 같은 형식으로, 한 줄에 JSON 값 하나입니다. 이 도구는 줄바꿈 문자로 구분한 압축 객체를 씁니다.
어떤 요소가 한 줄이 되는지 어떻게 고르나요?
레코드 경로 선택기를 쓰세요. 요소가 반복되는 경로가 나열되고 자동은 가장 바깥 경로를 고릅니다.
중첩 요소도 평평해지나요?
아니요. 중첩 요소는 중첩 객체로, 반복 자식은 배열로 남습니다. 평평한 열이 필요하면 XML CSV 변환기를 쓰세요.
줄 둘레에 쉼표나 대괄호가 없는 이유는?
JSON Lines에는 감싸는 배열이 없습니다. 각 줄이 독립적인 JSON 값이어서 읽는 쪽이 파일을 스트림으로 처리할 수 있습니다.
속성 이름 붙이는 방식을 바꿀 수 있나요?
네. JSONL에서는 속성 접두사가 기본적으로 비어 있고, 매핑 패널에서 @ 등 원하는 문자로 지정할 수 있습니다. 속성 옆 텍스트의 키 이름도 바꿀 수 있습니다.
업로드되나요?
아니요. 모든 처리가 브라우저 탭 안에서 일어나며 최대 20 MiB까지 받습니다.
마지막 업데이트:
