在Python中解析JSON时出现各种错误

时间:2012-09-07 22:46:19

标签: python json simplejson

尝试从需要登录的网址解析json。包括我在这里的所有代码,因为我不确定错误在哪里。

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)

如果我使用选项1运行代码(注释掉选项2),我会收到此错误:

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)

如果我运行选项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

据我所知,我的示例JSON有效:

  

{ “SET1”:[{ “DATA1”: “411”, “数据2”: “2033”, “DATA3”: “1”, “DATA4”: “43968077”, “DATA5”: “217”, “DATA6”: “106828”, “DATA7”:[]}],     “SET2”:{ “DATA8”: “411”, “数据9”: “2033”, “DATA10”: “43968077”, “DATA11”: “217223360”, “DATA12”: “106828”}}

simplejson version = 2.3.2, Python 2.7.3

这一切都很新,所以任何指针都会非常有用。

2 个答案:

答案 0 :(得分:8)

您要解码响应,而不是请求:

json_object = json.load(response)

响应是一个类似文件的对象,因此您可以使用.load()让json库直接读取它。

或者(以某些临时内存使用为代价),使用带有完全读取响应的.loads()函数:

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

请注意,python 2.7已经包含了simplejson库,重命名为json

import json

答案 1 :(得分:1)

你需要使用响应,而不是请求(可能只是一个错字?),而且你还需要使用response.read()来获取HTTP响应的主体:

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