🐍 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:と明示的に書くほうが意図が伝わります。