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

JSON을 JSONL로 변환

JSON 배열을 레코드마다 한 줄인 JSON Lines로 나눠 대량 로더와 스트리밍 도구에 바로 쓸 수 있게 합니다.

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

도구 작업 공간

예제

JSON 입력

23줄344byte

결과

⌘/Ctrl + Enter로 복사
결과 · data.jsonl
{"id":1,"name":"Ada Lovelace","email":"ada@example.com","active":true,"score":98.5}
{"id":2,"name":"Grace Hopper","email":"grace@example.com","active":false,"score":91}
{"id":3,"name":"Linus","email":null,"active":true,"score":87.25}
레코드3
크기234byte

JSON JSONL 변환기는 JSON 배열을 JSON Lines로 나눕니다. 배열의 원소는 각각 압축된 JSON 한 줄로 쓰이고 줄은 줄바꿈 문자 하나(\n)로 구분됩니다. 입력이 배열이 아니면 값 전체가 한 줄이 됩니다. 출력에는 바깥 대괄호도 레코드 사이 쉼표도 없습니다.

JSON Lines(NDJSON이라고도 함)는 읽는 쪽이 파일 전체를 파싱하지 않고 한 줄씩 처리할 수 있어서 대량 로더와 스트리밍 도구가 선호합니다. BigQuery 로드 작업, Elasticsearch 벌크 파일, OpenAI 파인튜닝 데이터셋, 많은 로그 수집기가 이 형식을 읽습니다.

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

사용 방법

  1. JSON 배열 붙여넣기

    배열을 붙여넣습니다. 전체 텍스트를 먼저 파싱하므로 들여쓰기가 된 입력도 괜찮습니다. 샘플 메뉴에서 API 응답, 중첩 배열, 경계 사례를 불러올 수 있습니다.

  2. 줄 읽기

    결과가 바로 표시됩니다. JSON이 잘못됐거나 원소가 50,000개를 넘으면 오류가 대신 나옵니다.

  3. 레코드 수 확인

    레코드 수치는 줄 수입니다. 배열 길이와 같아야 하고, 입력이 값 하나였다면 1입니다.

  4. 복사 또는 저장

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

  5. 필요하면 검증

    나중에 파일을 손으로 고쳤다면 JSONL 검증기에 넣어 더 이상 파싱되지 않는 줄을 찾으세요.

작동 원리

JSON Lines 형식

JSON Lines에는 세 가지 규칙이 있습니다. 파일은 UTF-8이고, 모든 줄은 유효한 JSON 값이며, 줄은 \n으로 구분됩니다. 마지막 레코드 뒤의 줄바꿈이 관례이고 이 도구도 항상 붙입니다. 단, 빈 배열은 출력이 비어 있습니다.

레코드 안에는 날것의 줄바꿈이 있을 수 없으므로 각 값을 JSON.stringify로 압축합니다. 문자열 안의 줄바꿈은 두 글자 \n으로 쓰여서 레코드를 나누지 않습니다.

입력출력
원소 N개인 배열N줄
객체1줄
스칼라 또는 null1줄
빈 배열빈 출력
중첩된 배열과 객체같은 줄 안에 유지

변환이 바꾸는 것

토큰 사이의 공백이 사라지고, 숫자는 파싱된 값에서 다시 직렬화되어 1.0은 1, 1e2는 100이 됩니다. 키 순서는 유지되지만 "10" 같은 정수형 키는 JavaScript 객체처럼 오름차순으로 맨 앞에 옵니다.

ASCII 밖의 문자는 이스케이프하지 않아 한글이나 이모지가 읽기 쉬운 채로 남습니다. U+2028과 U+2029는 JSON 문자열 안에서는 유효하지만 일부 줄 분리기가 줄바꿈으로 취급하므로 \u2028, \u2029 이스케이프로 씁니다. 문자열 값은 그대로이고 레코드가 둘로 잘리는 일이 없습니다.

[{"id":1},{"id":2}]
->
{"id":1}
{"id":2}

실제 예시

객체 배열을 JSON Lines로
입력
[
  {"id": 1, "name": "Ada", "tags": ["a", "b"]},
  {"id": 2, "name": "Bo", "address": {"city": "Seoul"}}
]
출력
{"id":1,"name":"Ada","tags":["a","b"]}
{"id":2,"name":"Bo","address":{"city":"Seoul"}}

각 원소가 불필요한 공백 없이 한 줄로 다시 직렬화되며, 레코드끼리 같은 키를 가질 필요는 없습니다. 파일은 줄바꿈으로 끝납니다.

객체 하나는 한 줄이 됩니다
입력
{
  "id": 1,
  "name": "single"
}
출력
{"id":1,"name":"single"}

들여쓴 객체가 레코드 하나로 합쳐집니다.

어떤 JSON 값이든 한 줄이 될 수 있습니다
입력
[3, null, "x", [1, 2], {"k": "한글"}]
출력
3
null
"x"
[1,2]
{"k":"한글"}

스칼라, null, 중첩 배열도 올바른 레코드입니다. ASCII가 아닌 텍스트는 이스케이프하지 않고 그대로 둡니다.

줄 구분 문자는 이스케이프됩니다
입력
["a\u2028b", "c\nd"]
출력
"a\u2028b"
"c\nd"

U+2028은 여섯 글자 \u2028로 쓰여서 유니코드를 인식하는 줄 분리기가 레코드를 자를 수 없고, 두 번째 문자열의 줄바꿈은 평범한 \n 이스케이프입니다.

빈 배열
입력
[]
출력

빈 배열은 줄도 끝의 줄바꿈도 없는 빈 출력이 됩니다.

자주 하는 실수

  • 객체 하나는 나뉘지 않습니다

    {"rows":[...]} 같은 객체는 한 줄이 됩니다. 레코드가 키 안에 들어 있으면 그 배열만 붙여넣으세요.

  • 숫자가 정규화됩니다

    1.0은 1로 쓰이고, 파싱한 숫자 토큰을 JavaScript 숫자로 바꾸는 과정에서 2^53을 넘는 정수는 반올림됩니다. 그런 ID는 문자열로 두세요.

  • 중첩 배열은 같은 줄에 남습니다

    나뉘는 것은 최상위 배열뿐입니다. 레코드 안의 배열은 그 자리에서 직렬화됩니다.

  • 레코드 수 한도

    레코드가 50,000개를 넘으면 오류가 납니다. 더 큰 내보내기는 배열을 나눠서 처리하세요.

  • 이스케이프는 글자만 바꾸고 값은 바꾸지 않습니다

    U+0085, U+2028, U+2029는 각각 \u0085, \u2028, \u2029로 씁니다. JSON 파서는 같은 문자로 복원하지만 Python str.splitlines 같은 유니코드 줄 분리기는 그 자리에서 레코드를 자를 수 없습니다.

  • 빈 배열은 빈 파일이 됩니다

    결과에 줄이 하나도 없어서 로더가 빈 입력이라며 거부할 수 있습니다.

자주 묻는 질문

JSONL과 NDJSON은 같은 건가요?

실제로는 같습니다. 둘 다 줄 바꿈으로 구분된 줄마다 JSON 값 하나인 형식이고, 이름은 거의 같은 형식을 설명하는 두 사양에서 왔습니다.

출력 끝에 줄바꿈이 붙나요?

네, 마지막 레코드 뒤에 붙습니다. 빈 배열은 빈 출력이 됩니다.

레코드마다 키가 달라도 되나요?

네. 각 줄이 독립적이라 레코드끼리 스키마를 공유하지 않아도 됩니다.

입력이 객체이면 어떻게 되나요?

객체는 한 줄이 됩니다. 배열만 여러 레코드로 나뉩니다.

U+2028을 왜 이스케이프하나요?

JSON.stringify는 U+2028과 U+2029를 날것의 문자로 두는데 일부 줄 분리기가 이를 줄바꿈으로 취급합니다. 이스케이프하면 값은 그대로이면서 레코드가 한 줄을 유지합니다.

JSONL을 다시 JSON으로 바꿀 수 있나요?

네. JSONL 검증기가 유효한 줄을 들여쓴 JSON 배열로 바꾸고 실패한 줄을 알려 줍니다.

몇 개의 레코드까지 변환되나요?

레코드 50,000개와 입력 20 MiB까지입니다.

데이터가 업로드되나요?

아니요. 변환은 브라우저 안에서 실행됩니다.

마지막 업데이트: