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 배열을 변환하는 순서

  1. 변환 방향을 고릅니다 JSONL에서 JSON 배열로, 또는 JSON 배열에서 JSONL로 중 하나를 고릅니다.
  2. 데이터를 붙여 넣습니다 JSONL이면 한 줄에 객체 하나, 배열이면 `[`로 시작하는 텍스트를 그대로 넣습니다.
  3. 오류가 나면 그 줄을 확인합니다 어느 줄이 JSON으로 해석되지 않았는지 알려 줍니다. 끝의 쉼표나 닫지 않은 따옴표가 흔한 원인입니다.
  4. 결과를 복사합니다 변환 결과를 그대로 파일로 저장하거나 다음 단계로 넘길 수 있습니다.

더 잘 활용하기 위한 팁

  • 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 배열은 `[ {...}, {...} ]`처럼 전체를 하나의 배열로 묶는 형식이라, 전체를 파싱하지 않으면 개별 요소에 접근할 수 없습니다. 반면 JSON Lines는 한 줄에 하나의 독립된 JSON 객체를 나열하는 형식으로, 한 줄씩 스트림 처리가 가능해 거대한 로그 파일이나 머신러닝 데이터셋을 순차적으로 처리하는 데 적합합니다.

OpenAI를 비롯한 머신러닝 플랫폼의 파인튜닝용 데이터셋, Elasticsearch·Logstash 같은 로그 수집 도구의 출력 형식, 대량 데이터의 스트리밍 처리 등 한 건씩 독립적으로 읽고 쓰고 싶은 상황에서 표준적으로 사용됩니다.

"JSONL → JSON 배열" 모드에서는 각 줄이 개별적으로 유효한 JSON이어야 하며, 단 한 줄이라도 구문 오류가 있으면 해당 줄 번호를 포함한 오류가 표시됩니다. "JSON 배열 → JSONL" 모드에서는 입력 전체가 배열(`[`로 시작해 `]`로 끝나는 형식)이어야 합니다.

JSON 배열로 변환한 결과는 `jq` 명령어나 각 프로그래밍 언어의 표준 JSON 파서로 그대로 다룰 수 있습니다. 반대로 JSONL로 변환한 결과는 `jq -c`나 `grep`·`awk` 같은 줄 단위 처리 도구와 궁합이 좋아 로그 분석 파이프라인에 통합하기 쉬워집니다.
툴군

여담 ― 왜 "한 줄에 하나의 레코드"라는 형식이 생겨났을까

JSON Lines(JSONL이라고도 함)라는 형식이 탄생한 배경에는, 일반적인 JSON 배열에는 "전체를 메모리에 읽어들여 파싱을 마칠 때까지 중간 결과 하나조차 꺼낼 수 없다"는 제약이 있었다는 점을 들 수 있습니다. 수백만 줄에 달하는 로그 데이터나 머신러닝 학습 데이터셋을 JSON 배열로 다루려면 파일 전체를 메모리에 펼쳐야 했고, 거대한 파일에서는 메모리 부족이나 파싱 시간 증가라는 문제가 발생했습니다.

JSON Lines는 이 문제를 "한 줄 = 하나의 완결된 JSON 객체"라는 단순한 제약으로 해결합니다. 파일을 한 줄씩 읽으면서 그때그때 파싱할 수 있기 때문에 파일 전체를 메모리에 읽어들일 필요가 없고, 스트림 처리·병렬 처리와 궁합이 매우 좋다는 특징이 있습니다. 이러한 설계 사상은 Unix 계열 운영체제의 전통적인 "한 줄에 하나의 레코드"라는 텍스트 처리 문화(`grep`·`awk`·`sed` 등의 명령어가 줄 단위로 동작하는 것)와도 친화성이 높아, 기존의 명령줄 도구들에 그대로 통합할 수 있다는 실용적인 장점도 크다고 여겨집니다.

오늘날에는 AI·머신러닝 분야의 데이터셋 배포 형식으로 널리 채택되어, 대규모 언어 모델의 학습 데이터나 파인튜닝용 프롬프트·응답 쌍 등이 JSON Lines 형식으로 배포되는 경우가 일반적입니다.