Handle JSON Decode Error when nothing returned

后端 未结 2 928
囚心锁ツ
囚心锁ツ 2020-11-30 00:17

I am parsing json data. I don\'t have an issue with parsing and I am using simplejson module. But some api requests returns empty value. Here is my example:

相关标签:
2条回答
  • 2020-11-30 00:42

    If you don't mind importing the json module, then the best way to handle it is through json.JSONDecodeError (or json.decoder.JSONDecodeError as they are the same) as using default errors like ValueError could catch also other exceptions not necessarily connected to the json decode one.

    from json.decoder import JSONDecodeError
    
    
    try:
        qByUser = byUsrUrlObj.read()
        qUserData = json.loads(qByUser).decode('utf-8')
        questionSubjs = qUserData["all"]["questions"]
    except JSONDecodeError as e:
        # do whatever you want
    

    //EDIT (Oct 2020):

    As @Jacob Lee noted in the comment, there could be the basic common TypeError raised when the JSON object is not a str, bytes, or bytearray. Your question is about JSONDecodeError, but still it is worth mentioning here as a note; to handle also this situation, but differentiate between different issues, the following could be used:

    from json.decoder import JSONDecodeError
    
    
    try:
        qByUser = byUsrUrlObj.read()
        qUserData = json.loads(qByUser).decode('utf-8')
        questionSubjs = qUserData["all"]["questions"]
    except JSONDecodeError as e:
        # do whatever you want
    except TypeError as e:
        # do whatever you want in this case
    
    0 讨论(0)
  • 2020-11-30 01:08

    There is a rule in Python programming called "it is Easier to Ask for Forgiveness than for Permission" (in short: EAFP). It means that you should catch exceptions instead of checking values for validity.

    Thus, try the following:

    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: Since simplejson.decoder.JSONDecodeError actually inherits from ValueError (proof here), I simplified the catch statement by just using ValueError.

    0 讨论(0)
提交回复
热议问题