代码之家  ›  专栏  ›  技术社区  ›  thornomad

通过url获取json数据并在python中使用(simplejson)

  •  38
  • thornomad  · 技术社区  · 15 年前

    我认为这必须有一个简单的答案,但我正在努力:我想要一个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
    

    你知道我哪里出错了吗?

    3 回复  |  直到 13 年前
        1
  •  43
  •   unutbu    15 年前

    尝试

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

    不首先运行f.read()。当您运行f.read()时,filehandle的内容会被屏蔽,因此当您调用 simplejson.load(f)

        2
  •  10
  •   Ned Batchelder    15 年前

    第一行读取整个文件。然后第二行试图从文件中读取更多内容,但没有留下任何内容:

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

    或者省略f.read()行,或者保存read中的值,并在加载中使用它:

    json = f.read()
    simplejson.loads(json)
    
        3
  •  -7
  •   Paul Sutter    13 年前

    有一个更简单的方法-你根本不需要simplejson。只要将true/false/null设置为正确的值,python就可以使用eval语句将JSON解析为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)