关于python:json响应有什么问题

what is wrong with json response

json响应正常工作:

1
2
3
obj = urllib.urlopen("http://www.omdbapi.com/?t=Fight Club")
response_str = obj.read()
response_json = simplejson.loads(response_str)

上面的代码使json请求看起来像:

1
2
3
4
5
6
7
8
{
   "Title":"Fight Club",
   "Year":"1999",
   "Rated":"R",
   "Released":"15 Oct 1999",
     ......
   "Response":"True"
}

所以我现在可以睡觉了......但是

json响应无法正常工作:

1
2
3
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请求看起来像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{

   "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"
            }
        }

       ]
}

回报

1
2
JSONDecodeError at /
No JSON object could be decoded: line 1 column 0 (char 0)

而不是使用simplejson我尝试了json,它给出了以下错误:

1
2
ValueError at /
No JSON object could be decoded

我尝试过但失败了:

我在stackoverflow上尝试了我的问题的答案有同样的问题,但没有一个给出明确的解决方案虽然每个人都以某种方式帮助了我

1)我检查了json内容编码是否正确

1
2
3
4
5
>>obj.info()

Content-Type: application/json;
charset=utf-8
Content-Length: 2398

2)我在utf-8中解码了response_str

1
json.loads(response_str).decode("utf-8")

3)我用jsonlint检查json响应的格式

1
2
3
4
Parse error on line 1:

^
Expecting '{', '['

令人惊讶的是,在我获得睡眠的链接之后。
JSONDecodeError:期望值:第1行第1列(char 0)

基本上我在两种情况下都使用精确代码来获取json响应,但是第二次json响应有什么不对,只有差异我注意到第二次json响应的结构与第一次响应不同。

请提供解释以了解问题。


我来给你一些建议。 使用urllib非常棒,但是你会遇到很多麻烦。 所以,让我救你痛苦,然后引导你去requests。 它是处理url请求的最佳方式。

这个简短的IDLE会话将证明:

1
2
3
4
5
6
7
8
9
10
11
>>> 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


保持良好睡眠的一种方法是使用请求:

1
2
3
4
5
6
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

没有错误,只是工作。


其他答案提到requests库,但基于StackOverflow上的其他一些答案,似乎您也可以修改代码以包含GZip解压缩。 根据这个答案,我认为这将是:

1
2
3
4
5
6
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())