Python CPython 3.14.3에서 파서를 실행해 확인했습니다.
Extra data: line L column C (char N)
json.loads가 완결된 값을 하나 파싱하고 나서 또 내용을 발견했습니다. 파이썬은 그것을 extra data라고 부릅니다. 보고된 줄이 2 이상이고 각 줄이 완결된 레코드처럼 보인다면, 그 파일은 JSON Lines이고 한 줄씩 읽어야 합니다.
JSON을 붙여넣고 어디서 깨지는지 정확히 확인하기
입력
붙여 넣은 것은 여러분의 브라우저를 떠나지 않습니다. connect-src 허용 목록 덕분에 이는 약속이 아니라 브라우저가 강제하는 보장입니다. 직접 확인하기
실제 원인
어느 쪽이 답인 경우가 많은지, 그 순서대로 정리했습니다.
-
01 파일이 JSON Lines
한 줄에 JSON 객체 하나, 쉼표 없음, 감싸는 배열 없음. 로그, BigQuery 내보내기, 스트리밍 API의 표준 출력 형식입니다.
깨지는 예
with open('events.jsonl') as f: data = json.load(f) # Extra data: line 2 column 1되는 예
with open('events.jsonl') as f: data = [json.loads(line) for line in f if line.strip()] # or, with pandas import pandas as pd df = pd.read_json('events.jsonl', lines=True) -
02 반복문 안에서 json.dumps를 부르며 같은 파일에 덧붙임
호출할 때마다 완결된 문서가 하나씩 쓰이므로, 파일에는 결국 여러 개가 들어갑니다. 의도적으로 JSON Lines로 쓰고 그렇게 읽든지, 레코드를 리스트에 모아 한 번만 dump하든지 택하세요.
깨지는 예
for row in rows: f.write(json.dumps(row))되는 예
for row in rows: f.write(json.dumps(row) + '\n') # NDJSON, read line by line # or f.write(json.dumps(rows)) # one array -
03 응답 두 개가 이어붙음
버퍼를 대체하지 않고 덧붙여 버린 재시도입니다.
다른 런타임에서의 같은 실수
밑바탕의 문제는 똑같고, 다른 건 문구뿐입니다. 동료가 이 중 하나를 들고 왔다면, 그 사람이 보고 있는 건 여러분이 보는 것과 같습니다.
| JavaScript (V8) | Unexpected non-whitespace character after JSON at position 8 (line 2 column 1) |
|---|
자주 묻는 질문
- 한 문자열에서 여러 문서를 읽는 파이썬 함수가 있나요?
- json.JSONDecoder().raw_decode(s, idx)가 값 하나를 파싱하고 어디서 멈췄는지 알려 주므로 반복할 수 있습니다. 줄로 구분된 파일이라면 줄바꿈으로 나누는 쪽이 더 단순하고 훨씬 빠릅니다.
- char 오프셋이 제 행·열과 안 맞는 이유는?
- char는 문자열 안의 절대 인덱스이고, 행과 열은 사람이 읽기 위한 위치입니다. 둘 다 같은 지점을 가리킵니다.