JSON响应有什么问题

4

正确工作的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)

我曾尝试使用json而非simplejson,但是遇到了以下错误:

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_str

json.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响应的结构与第一个不同。

请提供解释以便理解此问题。


2
服务器以gzipped编码返回响应。例如,在命令行中,curl 'https://api.stackexchange.com/2.1/answers?order=desc&sort=activity&site=stackoverflow' | gunzip将显示您期望的JSON。我不是Python用户,但显然一些答案提到的“requests”库可以正确处理gzipped内容。 - Joshua Taylor
嘿,我添加了一个图片-视频 gif 来帮助你。如果你选择使用 requests 工作,就像 Alecxe 所承诺的那样,你会睡得更好!:P - Games Brainiac
3个回答

7

让我给你一些建议。使用urllib是很好的,但你会遇到很多麻烦。所以,让我来帮你省去痛苦,直接引导你到requests。它是处理URL请求的最佳方式。

这个简短的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编写,因此安装非常简单。
这是一个演示视频: enter image description here 您的具体问题: enter image description here

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

没有错误,只是正常工作。

0

其他答案提到了requests库,但根据StackOverflow上的其他答案,似乎您也可以修改代码以包括GZip解压缩。根据this answer,我认为这将是:

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())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接