【问题标题】:what is wrong with json responsejson响应有什么问题
【发布时间】:2013-08-25 15:57:27
【问题描述】:

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

请提供解释以了解问题。

【问题讨论】:

标签: python json


【解决方案1】:

睡个好觉的一种方法是使用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

没有错误,可以正常工作。

【讨论】:

    【解决方案2】:

    让我给你一些建议。使用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编写,安装简单。

    这是一个演示视频:

    您的特殊问题:

    【讨论】:

      【解决方案3】:

      其他答案提到了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())
      

      【讨论】:

        猜你喜欢
        • 2018-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-25
        • 1970-01-01
        • 2014-07-10
        • 2021-11-07
        相关资源
        最近更新 更多