JSON Lines(JSONL) ⇔ JSON 배열 변환기
한 줄에 하나의 JSON 객체를 나열하는 JSON Lines 형식과 일반 JSON 배열을 서로 변환합니다. 머신러닝 데이터셋이나 로그 출력을 확인할 때 유용합니다.
JSON Lines(JSONL)란
JSON Lines는 한 줄에 JSON 객체 하나씩을 늘어놓은 형식입니다. 파일 전체로 보면 JSON이 아니므로 끝의 쉼표를 신경 쓸 필요가 없고, 줄을 덧붙이기만 하면 데이터를 더할 수 있습니다. 로그 출력, 기계학습 학습 데이터, BigQuery나 Elasticsearch로의 일괄 적재처럼 「한 건씩 흘려보내는」 용도에 널리 쓰입니다. 확장자는 `.jsonl`이나 `.ndjson`이 일반적입니다.
이 도구는 JSON Lines와 JSON 배열을 서로 변환합니다. JSONL에서 배열로 바꿀 때는 빈 줄을 건너뛰고, 어느 줄이든 JSON으로 깨져 있으면 그 사실을 오류로 알려 줍니다. 배열에서 JSONL로 바꿀 때는 최상위가 배열이 아니면 실패합니다. 모든 처리는 브라우저 안에서 끝나므로, 로그나 학습 데이터처럼 밖으로 내보내고 싶지 않은 내용도 안심하고 다룰 수 있습니다.
JSONL과 JSON 배열을 변환하는 순서
- 변환 방향을 고릅니다 JSONL에서 JSON 배열로, 또는 JSON 배열에서 JSONL로 중 하나를 고릅니다.
- 데이터를 붙여 넣습니다 JSONL이면 한 줄에 객체 하나, 배열이면 `[`로 시작하는 텍스트를 그대로 넣습니다.
- 오류가 나면 그 줄을 확인합니다 어느 줄이 JSON으로 해석되지 않았는지 알려 줍니다. 끝의 쉼표나 닫지 않은 따옴표가 흔한 원인입니다.
- 결과를 복사합니다 변환 결과를 그대로 파일로 저장하거나 다음 단계로 넘길 수 있습니다.
더 잘 활용하기 위한 팁
- JSON Lines(JSONL)는 한 줄에 하나의 독립된 JSON 객체를 나열하는 형식으로, OpenAI의 파인튜닝용 데이터셋이나 Elasticsearch/Logstash의 로그 출력 등에서 표준적으로 사용됩니다.
- "JSONL → JSON 배열" 모드에서는 각 줄이 개별적으로 파싱 가능한 JSON 객체여야 합니다. 빈 줄은 자동으로 건너뜁니다.
- "JSON 배열 → JSONL" 모드에서는 입력 전체가 하나의 JSON 배열(`[ ... ]`)이어야 합니다. 배열 내 각 요소가 한 줄씩 JSONL로 출력됩니다.
- 대용량 로그 파일을 JSONL에서 JSON 배열로 변환하면 `jq` 명령어나 각 프로그래밍 언어의 표준 JSON 배열 파서로 다루기 쉬워집니다.
이런 때에 쓸 수 있습니다
로그를 분석 도구에 넘길 때
한 줄에 한 건으로 출력된 애플리케이션 로그를 JSON 배열로 묶으면, 배열을 전제로 하는 도구와 라이브러리에서 그대로 다룰 수 있습니다.
기계학습 학습 데이터를 정리할 때
학습 데이터는 JSONL로 배포되는 경우가 많은 반면, 전처리 스크립트는 배열을 기대하기도 합니다. 그 사이를 이어 줍니다.
BigQuery나 Elasticsearch로 적재할 때
둘 다 줄바꿈으로 구분된 JSON을 입력 형식으로 받습니다. 가지고 있는 JSON 배열을 적재할 수 있는 형태로 바꿀 수 있습니다.
큰 JSON을 줄 단위로 다룰 수 있게 할 때
배열인 채로는 전체를 읽어야 처리를 시작할 수 있지만, JSONL로 만들면 한 줄씩 차례로 처리할 수 있습니다.
JSON Lines 용어
- JSON Lines(JSONL)
- 한 줄에 JSON 값 하나를 쓰는 형식입니다. **파일 전체는 JSON으로서 올바르지 않습니다**(여러 값이 늘어서기 때문입니다). 한 줄씩 독립적으로 읽을 수 있다는 점이 장점입니다.
- NDJSON
- Newline Delimited JSON의 줄임말로, JSON Lines와 거의 같은 것을 가리킵니다. 확장자 `.ndjson`도 이 이름에서 왔습니다.
- 스트림 처리
- 데이터 전체를 읽지 않고 도착한 앞쪽부터 차례로 처리하는 방식입니다. JSONL이 어울리는 것은 이 방식과 궁합이 좋기 때문입니다.
- 최상위
- JSON의 가장 바깥쪽 값입니다. 배열에서 JSONL로 바꾸려면 여기가 배열 `[...]`이어야 합니다. 객체 `{...}`인 채로는 변환할 수 없습니다.
- 빈 줄의 취급
- JSONL 규격상 빈 줄은 의미를 가지지 않습니다. 이 도구는 빈 줄을 건너뛰므로 파일 끝에 여분의 줄바꿈이 있어도 변환됩니다.
자주 묻는 질문
여담 ― 왜 "한 줄에 하나의 레코드"라는 형식이 생겨났을까
JSON Lines(JSONL이라고도 함)라는 형식이 탄생한 배경에는, 일반적인 JSON 배열에는 "전체를 메모리에 읽어들여 파싱을 마칠 때까지 중간 결과 하나조차 꺼낼 수 없다"는 제약이 있었다는 점을 들 수 있습니다. 수백만 줄에 달하는 로그 데이터나 머신러닝 학습 데이터셋을 JSON 배열로 다루려면 파일 전체를 메모리에 펼쳐야 했고, 거대한 파일에서는 메모리 부족이나 파싱 시간 증가라는 문제가 발생했습니다.
JSON Lines는 이 문제를 "한 줄 = 하나의 완결된 JSON 객체"라는 단순한 제약으로 해결합니다. 파일을 한 줄씩 읽으면서 그때그때 파싱할 수 있기 때문에 파일 전체를 메모리에 읽어들일 필요가 없고, 스트림 처리·병렬 처리와 궁합이 매우 좋다는 특징이 있습니다. 이러한 설계 사상은 Unix 계열 운영체제의 전통적인 "한 줄에 하나의 레코드"라는 텍스트 처리 문화(`grep`·`awk`·`sed` 등의 명령어가 줄 단위로 동작하는 것)와도 친화성이 높아, 기존의 명령줄 도구들에 그대로 통합할 수 있다는 실용적인 장점도 크다고 여겨집니다.
오늘날에는 AI·머신러닝 분야의 데이터셋 배포 형식으로 널리 채택되어, 대규모 언어 모델의 학습 데이터나 파인튜닝용 프롬프트·응답 쌍 등이 JSON Lines 형식으로 배포되는 경우가 일반적입니다.