通过url获取json数据并用于python(simplejson)

我想这必须有一个简单的答案,但我挣扎:我想要一个URL(其中输出JSON),并获取在Python中的可用字典中的数据。 我被困在最后一步。

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

任何想法,我要出错?

尝试

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

而不先运行f.read()。 当你运行f.read()时,文件句柄的内容是混淆的,所以当你的调用simplejson.load(f)

第一行读取整个文件。 第二行然后尝试从文件中读取更多,但没有任何剩余:

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

要么只是省略f.read()行,要么保存读取的值,并在加载中使用它:

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

有一个更简单的方法 – 你根本不需要simplejson。 Python只要将true / false / null设置为正确的值,就可以使用eval语句将jsonparsing为字典/数组。

 # 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)