1. ホーム
  2. python

[解決済み] 何も返ってこないときのJSONデコードエラーの処理

2023-01-11 12:24:36

質問

jsonデータをパースしています。パースには問題がなく、私は simplejson モジュールを使っています。しかし、いくつかのAPIリクエストは空の値を返します。以下は私の例です。

{
"all" : {
    "count" : 0,
    "questions" : [     ]
    }
}

これは、jsonオブジェクトをパースするコードのセグメントです。

 qByUser = byUsrUrlObj.read()
 qUserData = json.loads(qByUser).decode('utf-8')
 questionSubjs = qUserData["all"]["questions"]

いくつかのリクエストで述べたように、私は次のようなエラーが発生します。

Traceback (most recent call last):
  File "YahooQueryData.py", line 164, in <module>
    qUserData = json.loads(qByUser)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/simplejson/__init__.py", line 385, in loads
    return _default_decoder.decode(s)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/simplejson/decoder.py", line 402, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/simplejson/decoder.py", line 420, in raw_decode
    raise JSONDecodeError("No JSON object could be decoded", s, idx)
simplejson.decoder.JSONDecodeError: No JSON object could be decoded: line 1 column 0 (char 0)

このエラーを処理する最善の方法は何でしょうか?

どのように解決するのですか?

Pythonプログラミングには、quot;it is Easier to Ask for Forgiveness than for Permission"(略称:EAFP)と呼ばれるルールが存在します。これは、値の妥当性をチェックする代わりに、例外をキャッチするべきだという意味です。

したがって、次のようにしてみてください。

try:
    qByUser = byUsrUrlObj.read()
    qUserData = json.loads(qByUser).decode('utf-8')
    questionSubjs = qUserData["all"]["questions"]
except ValueError:  # includes simplejson.decoder.JSONDecodeError
    print('Decoding JSON has failed')

EDIT : 以来 simplejson.decoder.JSONDecodeError を継承しているので ValueError ( 証明はこちら ) を使用することで、catch 文を簡略化しました。 ValueError .