🐍 Python

JSONDecodeError でエラーを処理する

形式が不正な文字列をjson.loads()に渡すとjson.JSONDecodeError(ValueErrorのサブクラス)が発生します。外部から受け取ったデータを扱うコードでは、この例外を捕まえて適切に処理する必要があります。

try:
    json.loads(s)
except json.JSONDecodeError as e:
    e.msg  # エラーの内容
    e.pos  # エラーが起きた文字位置
import json

try:
    json.loads("{invalid json}")
except json.JSONDecodeError as e:
    print("JSONDecodeError:", e)
    print(e.msg)
    print(e.pos)
# JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
# Expecting property name enclosed in double quotes
# 1
# 空文字列もJSONDecodeErrorになる
import json

try:
    json.loads("")
except json.JSONDecodeError as e:
    print("JSONDecodeError:", e)
# JSONDecodeError: Expecting value: line 1 column 1 (char 0)
# JSONはシングルクォートを認めない(必ずダブルクォート)
import json

try:
    json.loads("{'a': 1}")
except json.JSONDecodeError as e:
    print("JSONDecodeError:", e)
# JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
JSONDecodeErrorの主な属性
msg
エラーの内容を表す文字列(位置情報を含まない部分)
pos
エラーが検出された文字位置(0始まりのインデックス)
lineno / colno
エラー位置の行番号・列番号(どちらも1始まり)
💡 AIコードレビュー観点:JSONDecodeErrorはValueErrorのサブクラス

json.JSONDecodeErrorはValueErrorを継承しているため、except ValueError:でも捕まえられます。AIが生成したコードで「JSON以外の入力パース処理と共通のexcept節」を使っている場合、意図せずJSONDecodeErrorを握りつぶしていないか確認しましょう。逆に、JSON特有のエラー処理(位置情報を使ったログ出力など)をしたい場合はexcept json.JSONDecodeError:と明示的に書くほうが意図が伝わります。

← Python json クイックリファレンス一覧へ戻る / loadsでJSON文字列を読み込む →