2012-06-01 14 views
26

बस बहुत ही सरल पायथन JSON आदेशों का परीक्षण करने का प्रयास कर रहा है, लेकिन मुझे कुछ परेशानी हो रही है।JSON के साथ urlopen.read से "बाइट-जैसी ऑब्जेक्ट" का उपयोग करें?

urlopen('http://www.similarsitesearch.com/api/similar/ebay.com').read() 

उत्पादन

'{"num":20,"status":"ok","r0":"http:\\/\\/www.propertyroom.com\\/","r1":"http:\\/\\/www.ubid.com\\/","r2":"http:\\/\\/www.bidcactus.com\\/","r3":"http:\\/\\/www.etsy.com\\/","r4":"http:\\/\\/us.ebid.net\\/","r5":"http:\\/\\/www.bidrivals.com\\/","r6":"http:\\/\\/www.ioffer.com\\/","r7":"http:\\/\\/www.shopgoodwill.com\\/","r8":"http:\\/\\/www.beezid.com\\/","r9":"http:\\/\\/www.webidz.com\\/","r10":"http:\\/\\/www.auctionzip.com\\/","r11":"http:\\/\\/www.overstock.com\\/","r12":"http:\\/\\/www.bidspotter.com\\/","r13":"http:\\/\\/www.paypal.com\\/","r14":"http:\\/\\/www.ha.com\\/","r15":"http:\\/\\/www.onlineauction.com\\/","r16":"http:\\/\\/bidz.com\\/","r17":"http:\\/\\/www.epier.com\\/","r18":"http:\\/\\/www.sell.com\\/","r19":"http:\\/\\/www.rasmus.com\\/"}' 

लेकिन मैं मिलना चाहिए कि एक ही स्ट्रिंग, एक b सामने के साथ:

b'{"num":20,"status":"ok","r0":"http:\\/\\/www.propertyroom.com\\/","r1":"http:\\/\\/www.ubid.com\\/","r2":"http:\\/\\/www.bidcactus.com\\/","r3":"http:\\/\\/www.etsy.com\\/","r4":"http:\\/\\/us.ebid.net\\/","r5":"http:\\/\\/www.bidrivals.com\\/","r6":"http:\\/\\/www.ioffer.com\\/","r7":"http:\\/\\/www.shopgoodwill.com\\/","r8":"http:\\/\\/www.beezid.com\\/","r9":"http:\\/\\/www.webidz.com\\/","r10":"http:\\/\\/www.auctionzip.com\\/","r11":"http:\\/\\/www.overstock.com\\/","r12":"http:\\/\\/www.bidspotter.com\\/","r13":"http:\\/\\/www.paypal.com\\/","r14":"http:\\/\\/www.ha.com\\/","r15":"http:\\/\\/www.onlineauction.com\\/","r16":"http:\\/\\/bidz.com\\/","r17":"http:\\/\\/www.epier.com\\/","r18":"http:\\/\\/www.sell.com\\/","r19":"http:\\/\\/www.rasmus.com\\/"}' 

बाद में, जब मैं

json.loads(urlopen('http://similarsitesearch.com/api/similar/ebay.com').read()) 

चलाने का प्रयास यह मुझे त्रुटि संदेश देता है जीई:

TypeError: can't use a string pattern on a bytes-like object"

जो मुझे लगता है कि b के साथ कुछ करना है?

मैं urllib.request से urlopen आयातित, और मैं पायथन 3.

कोई भी विचार चल रहा हूँ?

उत्तर

0

urllib एक बाइट सरणी लौटा रहा है, जो मुझे लगता है कि py3 में डिफ़ॉल्ट है, और जेसन एक स्ट्रिंग की अपेक्षा कर रहा है। json कॉल

j = str(urlopen('http://similarsitesearch.com/api/similar/ebay.com').read()) 
json.loads(j) 
+1

Hmmmm, अब इसकी मुझे बता कि –

+3

ऐसा इसलिए है क्योंकि 'str()' 'बाइट्स' को 'x' में' str 'में परिवर्तित नहीं करता है। –

6

आप इसे json.load*() को पार करने से पहले चारसेट कि द्वारा Content-Type शीर्षक और डिकोड में निर्दिष्ट की जांच करने की जरूरत है लागू करने से पहले एक str() कॉल में वापसी मान लपेटकर कोशिश करो।

+0

यह यूटीएफ -8 प्रतीत होता है, कोई स्वचालित डिकोडिंग नहीं होती है? (क्या ऐतिहासिक रूप से था?) –

+4

वहां कभी नहीं था; 'urllib.urlopen()। पढ़ा()' 2.x में एक बाइटस्ट्रिंग भी लौटा। ऐसा ही हुआ कि 'जेसन' ठीक था। –

+0

क्षमा करें, मुझे काफी समझ में नहीं आ रहा है। आगे स्पष्टीकरण? :) –

0

byte literal जैसा दिखता है। जांच करें कि आप http के साथ डेटा कैसे प्राप्त करते हैं, या एपीआई हेडर में डेटा कैसे देता है।

29

पढ़ने की सामग्री (0) की सामग्री बाइट है, इसलिए इसे किसी जेसन ऑब्जेक्ट में डीकोड करने का प्रयास करने से पहले इसे एक स्ट्रिंग में परिवर्तित करने की आवश्यकता है।

एक स्ट्रिंग के लिए बाइट्स बदलने के लिए, करने के लिए अपने कोड बदलने के लिए: urlopen('http://similarsitesearch.com/api/similar/ebay.com').read().decode("utf-8")

7

यह अच्छी तरह से काम किया: "। कोई JSON ऑब्जेक्ट डीकोड किया जा सकता है"

def myView(request): 
    encoding = request.read().decode("utf-8") 
    dic = json.loads(encoding) 
    print(dic)