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 などの別物です。
まず渡している文字列そのものを覗くのが最短です。
よくある原因
- レスポンス本文が空のまま
json.loads()に渡している。 - API が JSON ではなく HTML のエラーページや空ボディを返している。
- ファイルを読まず、パス文字列やファイルオブジェクトを誤って渡している。
- 末尾カンマやシングルクオートなど、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.pos と e.doc[:80] をログに出すと切り分けが速くなります。