2014-04-03 56 views
1

即使JSON代碼是正確的(我測試它與JSON Validator)我得到這個錯誤。這裏是我的代碼:ValueError:沒有JSON對象可以解碼錯誤與有效的JSON

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 
+0

錯誤在哪裏? – SzieberthAdam

回答

2

打印出原始json字符串時清空請求緩衝區,調用search_results.read()

當您再次調用它來解碼JSON時,緩衝區爲空,並且您無法解碼它返回的空字符串。

0

您的JSON是有效的,但是它的一些字符串包含換行符\n。 如果它們意圖成爲字符串的一部分,則需要將它們轉義(之前添加\)。如果他們不打算成爲字符串的一部分,你應該從中刪除它們。

所以基本上你需要把你的JSON中的所有\n替換成\\n,或者刪除它們。

回答類似的問題here

+1

只有當json位於python字符串_literal_內時纔有意義。在這種情況下,操作系統正在從服務器獲取它。 – Eric

+0

好點,我誤讀了 –

相關問題