JSON Lines(JSONL) ⇔ JSON 배열 변환기

한 줄에 하나의 JSON 객체를 나열하는 JSON Lines 형식과 일반 JSON 배열을 서로 변환합니다. 머신러닝 데이터셋이나 로그 출력을 확인할 때 유용합니다.

사용 팁

  • JSON Lines(JSONL)는 한 줄에 하나의 독립된 JSON 객체를 나열하는 형식으로, OpenAI의 파인튜닝용 데이터셋이나 Elasticsearch/Logstash의 로그 출력 등에서 표준적으로 사용됩니다.
  • "JSONL → JSON 배열" 모드에서는 각 줄이 개별적으로 파싱 가능한 JSON 객체여야 합니다. 빈 줄은 자동으로 건너뜁니다.
  • "JSON 배열 → JSONL" 모드에서는 입력 전체가 하나의 JSON 배열(`[ ... ]`)이어야 합니다. 배열 내 각 요소가 한 줄씩 JSONL로 출력됩니다.
  • 대용량 로그 파일을 JSONL에서 JSON 배열로 변환하면 `jq` 명령어나 각 프로그래밍 언어의 표준 JSON 배열 파서로 다루기 쉬워집니다.

자주 묻는 질문

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 형식으로 배포되는 경우가 일반적입니다.