C.W.K.
Stream
Lesson 03 of 08 · published

JSON Lines — 줄당 한 JSON 값

~10 min · json, jsonl, ndjson, streaming

Level 0평문
0 XP0/64 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

스트림, log, ML 데이터셋 포맷

JSON Lines (가끔 NDJSON — newline-delimited JSON, 같은 거) 가 각 줄이 한 독립 JSON 값인 파일 포맷. 감싸는 배열 없음, 레코드 사이 콤마 없음, 최상위 구조 없음. 파일 확장자는 .jsonl 또는 .ndjson.

JSON 이 못 푸는 거 푸는 거

  • 스트리밍 — 한 줄 추가로 레코드 추가 가능. 일반 JSON 배열로는 매 추가마다 닫는 대괄호 다시 써야.
  • 부분 읽기 — 전체 파일 안 로드하고 한 번에 한 레코드 처리. log 파일과 큰 데이터셋에 중요.
  • 쉬운 concat / splitcat a.jsonl b.jsonl 가 합집합; split -l 1000 huge.jsonl 이 chunk 로 분할. 둘 다 작동, 각 줄이 self-contained 라.
  • grep 친화적grep error events.jsonl 가 파싱 없이 매칭 줄 찾음.

JSON Lines 만나는 곳

  • 애플리케이션 log 파일 (papertrail, vector.dev, fluentd).
  • ML 학습 데이터 (HuggingFace 데이터셋, OpenAI fine-tuning, instruction tuning).
  • 데이터베이스 export (MongoDB mongoexport, Firestore export).
  • 라이브 event tail.
원칙: 데이터가 레코드의 시퀀스 (log event, 학습 샘플, 시계열 행) 일 때 최상위 배열 아닌 JSONL 잡아. Append-only 가 저렴, 파싱이 record-at-a-time, 파일이 파서 안 깨고 GB 까지 scale.

Code

JSON Lines — 파일 포맷·text
{"timestamp":"2026-05-04T01:30:11Z","level":"info","event":"server.start"}
{"timestamp":"2026-05-04T01:30:12Z","level":"info","event":"db.connected"}
{"timestamp":"2026-05-04T01:30:15Z","level":"warn","event":"slow_query","duration_ms":1240}
{"timestamp":"2026-05-04T01:30:18Z","level":"error","event":"http.5xx","path":"/api/chat"}
레코드 추가 (파싱 불필요)·bash
# Plain shell — 어떤 크기 파일에든 작동
echo '{"event":"deploy.start","timestamp":"2026-05-04T01:30:11Z"}' >> events.jsonl

# 또는 한 번에 여러 개 파이프
for i in 1 2 3; do
  echo "{\"i\":$i}"
done >> events.jsonl
Python 에서 JSON Lines 줄별 읽기·python
import json

# 한 번에 한 레코드 처리 — 전체 파일 절대 안 로드
with open('events.jsonl') as f:
    for line in f:
        line = line.strip()
        if not line:
            continue
        record = json.loads(line)
        if record.get('level') == 'error':
            print(record['event'], record.get('path'))
JSON Lines 와 jq·bash
# 에러만 필터
jq -c 'select(.level == "error")' events.jsonl

# 집계 — 단계별 카운트 (스트림 slurp)
jq -s 'group_by(.level) | map({level: .[0].level, count: length})' events.jsonl

# JSON 배열을 JSON Lines 로 변환
jq -c '.[]' big-array.json > records.jsonl

External links

Exercise

접근 가능한 log source (애플리케이션 log, audit log, Stripe event) 골라. chunk 한 개를 JSONL 로 변환. jq -c 'select(...)' file.jsonl 로 한 event 타입 필터. 이제 최상위 JSON 배열로 같은 거 상상 — JSONL 이 스트리밍 이긴 이유 느껴봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.