Various errors while parsing JSON in Python

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.

Answers


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

Need Your Help

svmlight warning: Relaxing epsilon on KT-Conditions

machine-learning svm

I am trying to learn a dataset using Svmlight. I always see the following warning during the optimization process.

Creating a Velocity template for Dynamic Data List (Liferay 6.2)

templates liferay velocity freemarker datalist

I'm currently working with liferay 6.2 but i'm having problems to create a Display Template for a Dynamic data list. I'm trying to follow this guide:

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.