1. ホーム
  2. python

[解決済み] "No JSON object could be decoded "よりも良いエラーメッセージを表示する。

2022-02-14 13:44:04

質問

ある長い複雑なJSONファイルからデータをロードするPythonコード。

with open(filename, "r") as f:
  data = json.loads(f.read())

(注)最適なコードバージョンは、こうあるべき。

with open(filename, "r") as f:
  data = json.load(f)

が、どちらも似たような挙動を示します)

多くの種類のJSONエラー(区切り文字がない、文字列のバックスラッシュが正しくないなど)に対して、JSONエラーが見つかった行番号と列番号を含む親切なメッセージを表示します。

しかし、他のタイプのJSONエラー(古典的な "リストの最後のアイテムでカンマを使う" だけでなく、true/false を大文字にするなど他のものも含む)については、Pythonの出力は単なるものです。

Traceback (most recent call last):
  File "myfile.py", line 8, in myfunction
    config = json.loads(f.read())
  File "c:\python27\lib\json\__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "c:\python27\lib\json\decoder.py", line 360, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "c:\python27\lib\json\decoder.py", line 378, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

このタイプのValueErrorの場合、JSONファイルのどこにエラーがあるかをPythonに教えてもらうにはどうすればいいでしょうか。

解決方法は?

私は simplejson モジュールは、多くの場合、組み込みの json モジュールは曖昧です。例えば、リストの最後の項目の後にカンマがあるような場合です。

json.loads('[1,2,]')
....
ValueError: No JSON object could be decoded

というのは、あまり説明的ではありません。と同じ操作で simplejson :

simplejson.loads('[1,2,]')
...
simplejson.decoder.JSONDecodeError: Expecting object: line 1 column 5 (char 5)

ずっといい! 同様に、大文字と小文字を区別するような他のよくある誤りについても True .