【问题标题】:ValueError: No JSON object could be decoded error with valid jsonValueError: No JSON object could be decoded error with valid json
【发布时间】:2014-04-03 12:45:09
【问题描述】:

即使 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

【问题讨论】:

    标签: json python-3.x


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      回答了一个类似的问题here

      【讨论】:

      • 这仅在 json 在 python 字符串 literal 中时才相关。在这种情况下,操作是从服务器获取它。
      猜你喜欢
      • 2023-03-29
      • 2018-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 2023-02-11
      相关资源
      最近更新 更多