できない.dev

Python で「json.decoder.JSONDecodeError: Expecting value」が解消できない

`JSONDecodeError: Expecting value: line 1 column 1 (char 0)` は、空文字列や JSON でない文字列を `json.loads()` に渡したときに出る。
まずデコード対象の中身を確認するのが近道。

#python#json#jsondecodeerror#exception#parsing

公開: 更新:

要約

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) は、json.loads() に渡した文字列が JSON として始まっていないときの定番エラーです。

char 0 は「先頭からおかしい」という意味で、ほとんどの場合は中身が空、または HTML などの別物です。

まず渡している文字列そのものを覗くのが最短です。

よくある原因

  1. レスポンス本文が空のまま json.loads() に渡している。
  2. API が JSON ではなく HTML のエラーページや空ボディを返している。
  3. ファイルを読まず、パス文字列やファイルオブジェクトを誤って渡している。
  4. 末尾カンマやシングルクオートなど、JSON として不正な文字列を渡している。

解決策

1. 中身を確認する

パースの前に、対象を repr で表示して空や HTML でないか確かめます。

print(repr(text))      # '' や '<!DOCTYPE html>...' ならパース以前の問題
data = json.loads(text)

2. HTTP エラーを先に弾く

requests では、ステータス確認のあとに .json() を呼びます。

resp = requests.get(url)
resp.raise_for_status()   # 4xx/5xx をここで例外に
data = resp.json()

3. ファイルは load で読む

パス文字列を loads に渡すのは誤りです。
開いてから load を使います。

with open(path, encoding="utf-8") as f:
    data = json.load(f)

捕捉して原因を残すなら、except json.JSONDecodeError as e:e.pose.doc[:80] をログに出すと切り分けが速くなります。

この記事は役立ちましたか?