Various errors while parsing JSON in Python

15,925

Solution 1

You want to decode the response, not the request:

json_object = json.load(response)

The response is a file-like object, so you can use .load() to have the json library read it directly.

Alternatively (at the cost of some temporary memory use), use the .loads() function with the fully read response:

json_object = json.loads(response.read())

Note that python 2.7 already includes the simplejson library, renamed to json:

import json

Solution 2

You need to use response, not request (maybe just a typo?), but furthermore you need to use response.read() to get the body of the HTTP response:

json_object = json.loads(response.read())
Share:
15,925
acpigeon
Author by

acpigeon

Product manager learning to program for fun.

Updated on June 26, 2022

Comments

  • acpigeon
    acpigeon almost 2 years

    Attempting to parse json from a url requiring login. Including all my code here as I'm not sure where the error is.

    try: import simplejson as json
    except ImportError: import json
    import urllib2
    
    username = 'user'
    password = '1234'
    url = "https://www.blah.com/someplace"
    
    # set up the username/password/url request
    password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
    password_mgr.add_password(None, "https://www.blah.com", username, password)
    handler = urllib2.HTTPBasicAuthHandler(password_mgr)
    opener = urllib2.build_opener(handler)
    urllib2.install_opener(opener)
    request = urllib2.Request(url)
    response = opener.open(request)
    
    # option 1
    json_object = json.loads(str(response))
    
    #option 2
    json_object = json.loads(response)
    

    If I run the code with option 1 (commenting out option 2), I get this error:

    Traceback (most recent call last):
      File "jsontest.py", line 22, in <module>
        json_object = json.loads(str(request))
      File "/usr/lib/python2.7/dist-packages/simplejson/__init__.py", line 413, in loads
        return _default_decoder.decode(s)
      File "/usr/lib/python2.7/dist-packages/simplejson/decoder.py", line 402, in decode
        obj, end = self.raw_decode(s, idx=_w(s, 0).end())
      File "/usr/lib/python2.7/dist-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)
    

    If I run option 2:

    Traceback (most recent call last):
      File "jsontest.py", line 23, in <module>
        json_object = json.loads(request)
      File "/usr/lib/python2.7/dist-packages/simplejson/__init__.py", line 413, in loads
        return _default_decoder.decode(s)
      File "/usr/lib/python2.7/dist-packages/simplejson/decoder.py", line 402, in decode
        obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    TypeError: expected string or buffer
    

    My sample JSON is valid as far as I can tell:

    {"set1":[{"data1":"411","data2":"2033","data3":"1","data4":"43968077","data5":"217","data6":"106828","data7":[]}], "set2":{"data8":"411","data9":"2033","data10":"43968077","data11":"217223360","data12":"106828"}}

    simplejson version = 2.3.2, Python 2.7.3

    Very new to all this so any pointers would be very helpful.

  • acpigeon
    acpigeon over 11 years
    Correct, I needed to use .read() or load(). The 'response' was a typo yes. I now have a ready-to-go py dict, thanks!