Various errors while parsing JSON in Python
Question: 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.


Answer: 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`](http://docs.python.org/library/json.html):

    
    
    import json
    

