json.decoder.JSONDecodeError: Expecting value: line 1 column 1 の対処

結論を先に。このエラーは、JSONとして読もうとした中身が、実はJSONではない(空文字列、HTMLのエラーページ、プレーンテキストなど)ときに出ます。パースする前に、受け取った生の中身を一度表示して何が来ているかを確認するのが解決の早道です。

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

原因

「line 1 column 1(char 0)」は、いちばん先頭でいきなり失敗していることを意味します。つまり中身がそもそもJSONになっていません。API呼び出しが失敗してHTMLのエラーページが返っている、レスポンスが空、ファイルが空、文字列の前後に余計なものが付いている、などが典型です。

対処

  1. パースの前に、生の中身をそのまま表示して正体を見る。
print(repr(resp.text[:200]))
  1. requests を使っているなら、ステータスコードを確認してから .json() を呼ぶ。
import requests
resp = requests.get(url)
resp.raise_for_status() # 4xx/5xxならここで例外
data = resp.json()
  1. ファイルを読む場合は、空でないか・正しいJSONかを確認する。中身がHTMLなら、URLや認証が間違っている可能性が高い。
import json
with open("data.json", encoding="utf-8") as f:
text = f.read()
print(repr(text[:120]))
data = json.loads(text)

まとめ

  • 原因は中身がJSONでない(空・HTML・テキスト)こと
  • char 0 で失敗=先頭から壊れている合図
  • パース前に repr で生の中身を確認する
  • requests では raise_for_status でエラー応答を先に弾く