2009-10-28 5 views
38

में उपयोग करें मुझे लगता है कि इसका एक आसान जवाब होना चाहिए, लेकिन मैं संघर्ष कर रहा हूं: मैं एक यूआरएल (जो जेसन आउटपुट करता हूं) लेना चाहता हूं और पाइथन में उपयोग करने योग्य शब्दकोश में डेटा प्राप्त करना चाहता हूं । मैं आखिरी कदम पर फंस गया हूँ।यूआरएल के माध्यम से जेसन डेटा प्राप्त करें और पायथन (सरलजसन)

>>> import urllib2 
>>> import simplejson 
>>> req = urllib2.Request("http://vimeo.com/api/v2/video/38356.json", None, {'user-agent':'syncstream/vimeo'}) 
>>> opener = urllib2.build_opener() 
>>> f = opener.open(req) 
>>> f.read()    # this works 
'[{"id":"38356","title":"Forgetfulness - Billy Collins Animated Poetry","description":"US Poet Laureate Billy Collins reads his poem ","url":"http:\\/\\/vimeo.com\\/38356","upload_date":"2006-01-24 15:21:03","thumbnail_small":"http:\\/\\/80.media.vimeo.com\\/d1\\/5\\/47\\/74\\/thumbnail-4774968.jpg","thumbnail_medium":"http:\\/\\/80.media.vimeo.com\\/d1\\/5\\/46\\/85\\/thumbnail-4685118.jpg","thumbnail_large":"http:\\/\\/images.vimeo.com\\/87\\/39\\/873998\\/873998_640x480.jpg","user_name":"smjwt","user_url":"http:\\/\\/vimeo.com\\/smjwt","user_portrait_small":"http:\\/\\/bitcast.vimeo.com\\/vimeo\\/portraits\\/defaults\\/d.30.jpg","user_portrait_medium":"http:\\/\\/bitcast.vimeo.com\\/vimeo\\/portraits\\/defaults\\/d.75.jpg","user_portrait_large":"http:\\/\\/bitcast.vimeo.com\\/vimeo\\/portraits\\/defaults\\/d.100.jpg","user_portrait_huge":"http:\\/\\/bitcast.vimeo.com\\/vimeo\\/portraits\\/defaults\\/d.300.jpg","stats_number_of_likes":"281","stats_number_of_plays":"9173","stats_number_of_comments":23,"duration":"112","width":"320","height":"240","tags":"poetry, poet, online poetry, famous poet, video poetry, modern poetry, famous poem, poetry sites, poetry websites, audio poetry, american poet, animation clips, american poetry, free poetry sites, animation art, free poetry, animated clips, poem, poet laureate"}]' 
>>> simplejson.load(f) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/usr/lib/python2.5/site-packages/django/utils/simplejson/__init__.py", line 298, in load 
    parse_constant=parse_constant, **kw) 
    File "/usr/lib/python2.5/site-packages/django/utils/simplejson/__init__.py", line 338, in loads 
    return _default_decoder.decode(s) 
    File "/usr/lib/python2.5/site-packages/django/utils/simplejson/decoder.py", line 326, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/usr/lib/python2.5/site-packages/django/utils/simplejson/decoder.py", line 344, in raw_decode 
    raise ValueError("No JSON object could be decoded") 
ValueError: No JSON object could be decoded 

कोई विचार जहां मैं गलत हो रहा हूं?

+3

सरल चीजें पहले: स्निपेट में f.read() सिर्फ स्पष्टीकरण उद्देश्यों के लिए है, है ना? पूछने का कारण यह है कि यदि यह इच्छित कोड का हिस्सा है, तो इसका "खाली" एफ का प्रभाव पड़ता है, इसलिए ValueError w/simplejason। – mjv

+1

django.utils.simplejson को बहिष्कृत किया गया है; इसके बजाए जेसन का प्रयोग करें। – ifischer

उत्तर

43

f.read चल() पहले बिना

f = opener.open(req) 
simplejson.load(f) 

की कोशिश करो। जब आप f.read() चलाते हैं, तो फ़ाइलहेडल की सामग्री खराब हो जाती है, इसलिए आपकी कॉल simplejson.load(f)

+1

धन्यवाद - मैं यह सुनिश्चित करने के लिए चरण-दर-चरण कदम उठा रहा था कि मैं डेटा देख सकूं ... जाहिर है, 'पढ़ने() 'के बारे में पर्याप्त जानकारी नहीं है! धन्यवाद। – thornomad

+0

पायथन 3 में, सरलजसन को जेसन के साथ बदल दिया गया है, और इसे बाइट्स से रूपांतरण की आवश्यकता है। डेटा = json.loads (str (opener.open (req) .read(), "utf-8")) एक यूटीएफ -8 एन्कोडेड प्रतिक्रिया के लिए काम करेगा। – Mead

+2

उपरोक्त- "utf-8" रूपांतरण 'भार' के साथ चला जाता है, न कि 'str' (कम से कम पायथन 2.7.3) ~ 'data = json.loads (str (opener.open (req) .read()) , "utf-8") ' –

10

पहली पंक्ति पूरी फ़ाइल को पढ़ने पर कुछ भी नहीं बचा है। दूसरी पंक्ति तो फ़ाइल से अधिक पढ़ने के लिए कोशिश करता है, लेकिन वहाँ कुछ भी नहीं छोड़ा है:

>>> f.read()    # this works 
blah blah blah 
>>> simplejson.load(f) 

या तो सिर्फ f.read() लाइन को छोड़ देते हैं, या पढ़ने से मूल्य बचाने के लिए, और भार में इसका इस्तेमाल करते हैं:

json = f.read() 
simplejson.loads(json) 
-7

एक आसान तरीका है - आपको सरलजॉन की आवश्यकता नहीं है। पाइथन जब तक आप सही मानों को सही/गलत/शून्य सेट करते हैं, तब तक eval कथन का उपयोग करके जेसन को एक dict/array में पार्स कर सकते हैं।

# fetch the url 
url = "https://api.twitter.com/1/users/lookup.json?user_id=6253282,18949452" 
json = urllib2.urlopen(url).read() 

# convert to a native python object 
(true,false,null) = (True,False,None) 
profiles = eval(json) 
+3

यह आवश्यक है कि आप पूरी तरह से जेसन के स्रोत पर भरोसा करें, हालांकि – JeffS

+0

@JeffS क्या आप समझा सकते हैं कि ऐसा क्यों है? – Amanda

+4

कृपया देखें: http://docs.python.org/library/functions.html#eval तो जेसन स्ट्रिंग का मान पाइथन कोड के रूप में व्याख्या किया गया है, इसका मतलब है कि आप कोड को अपने प्रोग्राम के रूप में चलाने की अनुमति दे रहे हैं , और एक प्रमुख सुरक्षा मुद्दा हो सकता है। – JeffS

संबंधित मुद्दे