json响应正常工作:
obj = urllib.urlopen("http://www.omdbapi.com/?t=Fight Club")
response_str = obj.read()
response_json = simplejson.loads(response_str)
以上代码生成json请求,如下所示:
{
"Title":"Fight Club",
"Year":"1999",
"Rated":"R",
"Released":"15 Oct 1999",
......
"Response":"True"
}
所以我现在可以睡觉了......但是
json响应无法正常工作:
obj = urllib.urlopen("https://api.stackexchange.com/2.1/answers?order=desc&sort=activity&site=stackoverflow")
response_str = obj.read()
response_json = simplejson.loads(response_str)
以上代码生成json请求,如下所示:
{
"items": [
{
"question_id": 18384375,
"answer_id": 18388044,
"creation_date": 1377195687,
"last_activity_date": 1377195687,
"score": 0,
"is_accepted": false,
"owner": {
"user_id": 1745001,
"display_name": "Ed Morton",
"reputation": 10453,
"user_type": "registered",
"profile_image": "https://www.gravatar.com/avatar/99a3ebae89496eb16afe453aae97f5be?s=128&d=identicon&r=PG",
"link": "https://stackoverflow.com/users/1745001/ed-morton"
}
},
{
"question_id": 18387447,
"answer_id": 18388040,
"creation_date": 1377195667,
"last_activity_date": 1377195667,
"score": 0,
"is_accepted": false,
"owner": {
"user_id": 2494429,
"display_name": "kpark91",
"reputation": 140,
"user_type": "registered",
"profile_image": "https://www.gravatar.com/avatar/d903a03e7c5b6d9b21ff598c632de575?s=128&d=identicon&r=PG",
"link": "https://stackoverflow.com/users/2494429/kpark91"
}
}
]
}
返回
JSONDecodeError at /
No JSON object could be decoded: line 1 column 0 (char 0)
而不是使用simplejson我试过json,它给出了以下错误:
ValueError at /
No JSON object could be decoded
我尝试过但失败了:
我在stackoverflow上尝试了我的问题的答案有同样的问题,但没有一个给出了明确的解决方案,尽管每个人都以某种方式帮助了我
1)我检查了json内容编码是否正确
>>obj.info()
Content-Type: application/json;
charset=utf-8
Content-Length: 2398
2)我在utf-8
中解码了response_strjson.loads(response_str).decode("utf-8")
3)我使用jsonlint检查json响应的格式
Parse error on line 1:
^
Expecting '{', '['
令人惊讶的是,在我获得睡眠的链接之后。 JSONDecodeError: Expecting value: line 1 column 1 (char 0)
基本上我在两种情况下都使用精确代码来获取json响应,但第二次json响应有什么不对,只有差异我注意到第二次json响应的结构与第一次响应不同。
请提供解释以了解问题。
答案 0 :(得分:4)
获得良好睡眠的一种方法是使用requests:
import requests
import simplejson
response = requests.get("https://api.stackexchange.com/2.1/answers?order=desc&sort=activity&site=stackoverflow")
response_json = simplejson.loads(response.text)
print response_json
没有错误,只是有效。
答案 1 :(得分:4)
让我给你一些建议。使用urllib
非常棒,但是你会遇到很多麻烦。所以,让我为你省去痛苦,然后带你去requests
。它是处理网址请求的最佳方式。
这个简短的IDLE会话将证明:
>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text
u'{"type":"User"...'
>>> r.json()
{u'private_gists': 419, u'total_private_repos': 77, ...}
要安装它,只需转到命令提示符pip install requets
即可。 requets是免费和开源的,它用纯python编写,所以安装很简单。
以下是展示的视频:
你的特殊问题:
答案 2 :(得分:0)
其他答案提到requests
库,但基于StackOverflow上的其他一些答案,您似乎也可以修改代码以包含GZip解压缩。根据{{3}},我认为这将是:
import StringIO, gzip
obj = urllib.urlopen("https://api.stackexchange.com/2.1/answersorder=desc&sort=activity&site=stackoverflow")
data = StringIO.StringIO(obj.read())
gzipper = gzip.GzipFile(fileobj=data)
response_json = simplejson.loads(gzipper.read())