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

Expecting value: line 1 column 1 (char 0)

파이썬은 여러분이 건넨 것의 맨 첫 글자가 JSON 값의 시작이 아니라고 말하고 있습니다. 실제로 이 오류가 JSON이 미묘하게 잘못됐다는 뜻인 경우는 거의 없습니다. 파싱한 대상이 JSON이 아니라는 뜻입니다. HTML 오류 페이지, 빈 본문, 평범한 텍스트 메시지, 또는 아무것도 아닌 것. 위치가 1행 1열인 이유는 파서가 아무것도 읽기 전에 실패했기 때문입니다.

이렇게 적힌 것을 보게 될 수도 있습니다

  • json.decoder.JSONDecodeError: Expecting value

V8은 2022년에 JSON 오류 메시지 대부분을 다시 썼습니다. 검색 결과에 나오는 건 여전히 옛 문구가 대부분이지만, 지금의 어떤 런타임도 그 문구를 내보내지 않습니다.

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

입력

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

실제 원인

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

  1. 01 응답 본문이 JSON이 아니라 HTML

    404 페이지, 로그인 리다이렉트, Cloudflare 챌린지, 프록시 오류 페이지 같은 것들입니다. HTTP 수준에서는 요청이 성공했고 문서도 돌아왔습니다. 기대한 문서가 아니었을 뿐입니다. 파싱하기 전에 앞쪽 수백 글자를 찍어 보면 바로 보입니다.

    깨지는 예

    r = requests.get(url)
    data = r.json()   # JSONDecodeError

    되는 예

    r = requests.get(url)
    if r.status_code != 200 or 'json' not in r.headers.get('content-type', ''):
        raise RuntimeError(f"{r.status_code} {r.headers.get('content-type')}: {r.text[:300]}")
    data = r.json()
  2. 02 본문이 비어 있음

    HTTP 204, 레이트 리밋에 걸려 아무것도 돌려주지 않은 요청, 본문을 버린 WAF, 또는 존재하지만 0바이트인 파일. 빈 문자열은 유효한 JSON이 아닙니다. 가장 짧은 유효 문서는 null, 0, "", [], {} 입니다.

    깨지는 예

    json.loads("")

    되는 예

    text = r.text
    if not text.strip():
        return None
    data = json.loads(text)
  3. 03 JSON이 아닌 파일을 읽고 있음

    CSV, 로그 파일, 파이썬 pickle, 또는 각 줄이 별개의 문서인 JSON Lines 파일. JSON Lines라면 한꺼번에 말고 줄 단위로 파싱하세요.

    깨지는 예

    with open('events.jsonl') as f:
        data = json.load(f)   # Expecting value, or Extra data

    되는 예

    with open('events.jsonl') as f:
        data = [json.loads(line) for line in f if line.strip()]
  4. 04 인증에 실패해서 API가 평문 메시지를 돌려줌

    많은 API가 401이나 403과 함께 "Unauthorized"나 "Forbidden"을 JSON이 아니라 평문으로 돌려줍니다. 본문을 보기 전에 상태 코드를 확인하세요.

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

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

JavaScript (V8) Unexpected token '<', "<!DOCTYPE "... is not valid JSON
JavaScript (V8), empty input Unexpected end of JSON input
C# (Newtonsoft) Unexpected character encountered while parsing value: <. Path '', line 0, position 0.

자주 묻는 질문

왜 항상 1행 1열이라고 나오나요?
파서가 맨 첫 글자에서 실패했기 때문입니다. 2행까지 가지도 못했습니다. 오류가 더 뒤쪽 행과 열을 가리킨다면 문제가 정말로 JSON 안에 있는 것이고, 그건 다른 오류입니다.
실제로 뭘 받았는지 어떻게 보나요?
.json()을 부르기 전에 response.text[:500]을 출력하세요. 열에 아홉은 첫 줄에서 답이 보입니다. <!DOCTYPE html>이거나, 빈 문자열이거나, 짧은 평문 메시지입니다.
json.loads가 bytes 객체를 받나요?
받습니다. 파이썬 3.6부터 json.loads는 str뿐 아니라 bytes와 bytearray도 받고 UTF-8, UTF-16, UTF-32를 감지합니다. 그러니 이 오류의 원인이 bytes를 넘긴 것은 아닙니다.

지금 고치기

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

JSON 검증하기