ValueError:没有JSON对象可以使用有效的json解码错误

时间:2014-04-03 12:45:10

标签: json python-3.x

即使json代码是正确的,我也得到了这个错误(我用JSON Validator测试了它)。这是我的代码:

import urllib.request, urllib.parse
import json

num_queries = 50*4 
query = urllib.parse.urlencode({'q' : 'example'})
url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' % query

for start in range(0, num_queries, 4):
    request_url = '{0}&start={1}'.format(url, start)
    print(request_url)
    request = urllib.request.Request(request_url)
    request.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')
    search_results = urllib.request.urlopen(request)
    encoding = search_results.headers.get_content_charset()
    print(search_results.read().decode(encoding))
    json = json.loads(search_results.read().decode(encoding))
    results = json['responseData']['results']
    for i in results:
        print (i['url'])

以下是我得到的回复:

{
"responseData": {
    "results": [
        {
            "GsearchResultClass": "GwebSearch",
            "unescapedUrl": "http://example.com/",
            "url": "http://example.com/",
            "visibleUrl": "example.com",
            "cacheUrl": "http://www.google.com/search?q=cache:OEM9MzUDrRQJ:example.com",
            "title": "<b>Example</b> Domain",
            "titleNoFormatting": "Example Domain",
            "content": "<b>Example</b> Domain. This domain is established to be used for illustrative <b>examples</b> \nin documents. You may use this domain in <b>examples</b> without prior coordination ..."
        },
        {
            "GsearchResultClass": "GwebSearch",
            "unescapedUrl": "http://fr.wikipedia.org/wiki/Example_(chanteur)",
            "url": "http://fr.wikipedia.org/wiki/Example_(chanteur)",
            "visibleUrl": "fr.wikipedia.org",
            "cacheUrl": "http://www.google.com/search?q=cache:KQgswW_0sBoJ:fr.wikipedia.org",
            "title": "<b>Example</b> (chanteur) — Wikipédia",
            "titleNoFormatting": "Example (chanteur) — Wikipédia",
            "content": "Elliot John Gleave plus connu sous le pseudonyme <b>Example</b> (né le 20 juin 1982) \nest un chanteur et rappeur britannique. Son nom de scène vient de ses ..."
        },
        {
            "GsearchResultClass": "GwebSearch",
            "unescapedUrl": "http://www.trythisforexample.com/",
            "url": "http://www.trythisforexample.com/",
            "visibleUrl": "www.trythisforexample.com",
            "cacheUrl": "http://www.google.com/search?q=cache:VErXNqtEJDsJ:www.trythisforexample.com",
            "title": "<b>Example</b>",
            "titleNoFormatting": "Example",
            "content": "Official site for <b>Example</b>. ... Pre-order New Album · Tour Dates · Merch · Twitter · \nInstagram · Facebook · Youtube <b>Example</b> © 2013 Epic Records Privacy Policy."
        },
        {
            "GsearchResultClass": "GwebSearch",
            "unescapedUrl": "http://www.youtube.com/watch?v=CLXt3yh2g0s",
            "url": "http://www.youtube.com/watch%3Fv%3DCLXt3yh2g0s",
            "visibleUrl": "www.youtube.com",
            "cacheUrl": "http://www.google.com/search?q=cache:9CKsisLTCjgJ:www.youtube.com",
            "title": "<b>Example</b> - &#39;Changed The Way You Kiss Me&#39; (Official Video) - YouTube",
            "titleNoFormatting": "Example - &#39;Changed The Way You Kiss Me&#39; (Official Video) - YouTube",
            "content": "Apr 21, 2011 <b>...</b> Download <b>Example&#39;s</b> new single &#39;Perfect Replacement&#39; on iTunes (Out Now): http\n://www.smarturl.it/PERFECTREPLACEMENT For more Click ..."
        }
    ],
    "cursor": {
        "resultCount": "157 000 000",
        "pages": [
            {
                "start": "0",
                "label": 1
            },
            {
                "start": "4",
                "label": 2
            },
            {
                "start": "8",
                "label": 3
            },
            {
                "start": "12",
                "label": 4
            },
            {
                "start": "16",
                "label": 5
            },
            {
                "start": "20",
                "label": 6
            },
            {
                "start": "24",
                "label": 7
            },
            {
                "start": "28",
                "label": 8
            }
        ],
        "estimatedResultCount": "157000000",
        "currentPageIndex": 0,
        "moreResultsUrl": "http://www.google.com/search?oe=utf8&ie=utf8&source=uds&start=0&hl=fr&q=example",
        "searchResultTime": "0,22"
    }
},
"responseDetails": null,
"responseStatus": 200
}

错误:

Traceback (most recent call last):
  File "test.py", line 16, in <module>
    text = json.loads(search_results.read().decode(encoding))
  File "/usr/lib/python3.3/json/__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.3/json/decoder.py", line 352, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.3/json/decoder.py", line 370, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

2 个答案:

答案 0 :(得分:2)

打印出原始json字符串时调用search_results.read()会清空请求缓冲区。

当你再次调用它来解码JSON时,缓冲区为空,你无法解码它返回的空字符串。

答案 1 :(得分:0)

您的JSON有效,但是其中的某些字符串包含换行符\n。 如果它们是你需要转义的字符串的一部分(之前添加\)。如果他们不打算成为字符串的一部分,你应该将它们从中删除。

所以基本上你需要用\n替换JSON中的所有\\n,或者删除它们。

回答了一个类似的问题here