본문으로 건너뛰기
jsonbeautifiers
한국어
Python CPython 3.14.3에서 파서를 실행해 확인했습니다.

Extra data: line L column C (char N)

json.loads가 완결된 값을 하나 파싱하고 나서 또 내용을 발견했습니다. 파이썬은 그것을 extra data라고 부릅니다. 보고된 줄이 2 이상이고 각 줄이 완결된 레코드처럼 보인다면, 그 파일은 JSON Lines이고 한 줄씩 읽어야 합니다.

JSON을 붙여넣고 어디서 깨지는지 정확히 확인하기

입력

붙여 넣은 것은 여러분의 브라우저를 떠나지 않습니다. connect-src 허용 목록 덕분에 이는 약속이 아니라 브라우저가 강제하는 보장입니다. 직접 확인하기

실제 원인

어느 쪽이 답인 경우가 많은지, 그 순서대로 정리했습니다.

  1. 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)
  2. 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
  3. 03 응답 두 개가 이어붙음

    버퍼를 대체하지 않고 덧붙여 버린 재시도입니다.

다른 런타임에서의 같은 실수

밑바탕의 문제는 똑같고, 다른 건 문구뿐입니다. 동료가 이 중 하나를 들고 왔다면, 그 사람이 보고 있는 건 여러분이 보는 것과 같습니다.

JavaScript (V8) Unexpected non-whitespace character after JSON at position 8 (line 2 column 1)

자주 묻는 질문

한 문자열에서 여러 문서를 읽는 파이썬 함수가 있나요?
json.JSONDecoder().raw_decode(s, idx)가 값 하나를 파싱하고 어디서 멈췄는지 알려 주므로 반복할 수 있습니다. 줄로 구분된 파일이라면 줄바꿈으로 나누는 쪽이 더 단순하고 훨씬 빠릅니다.
char 오프셋이 제 행·열과 안 맞는 이유는?
char는 문자열 안의 절대 인덱스이고, 행과 열은 사람이 읽기 위한 위치입니다. 둘 다 같은 지점을 가리킵니다.

지금 고치기

위의 도구에 페이로드를 붙여넣거나, 이 일을 위해 만들어진 도구로 바로 가세요.

JSON Lines를 배열로 변환