【问题标题】:Get json data via url and use in python (simplejson)通过url获取json数据并在python中使用(simplejson)
【发布时间】:2010-12-11 01:47:34
【问题描述】:

我想这一定有一个简单的答案,但我很挣扎:我想获取一个 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

任何想法我哪里出错了?

【问题讨论】:

  • 简单的事情第一:sn-p 中的 f.read() 只是为了解释的目的,对吧?问的原因是因为如果它是预期代码的一部分,这会产生“清空” f 的效果,因此会出现带有 simplejason 的 ValueError。
  • django.utils.simplejson 已弃用;改用 json。

标签: python json urllib2 simplejson


【解决方案1】:

试试

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

没有先运行 f.read() 。当您运行 f.read() 时,文件句柄的内容会被删除,因此当您调用 simplejson.load(f)

时不会留下任何内容

【讨论】:

  • 谢谢你——我只是一步一步来确保我能看到数据......显然,对read()不够了解!谢谢。
  • 在python 3中simplejson被替换为json,需要从bytes转换。 data = json.loads(str(opener.open(req).read(),"utf-8")) 将适用于 UTF-8 编码的响应。
  • nit above —“utf-8”转换与loads 一起使用,而不是str(至少在python 2.7.3 中)~data = json.loads(str(opener.open(req).read()),"utf-8")
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    还有一种更简单的方法——你根本不需要 simplejson。 Python 可以使用 eval 语句将 json 解析为 dict/array,只要您将 true/false/null 设置为正确的值。

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

    【讨论】:

    • 这要求您绝对信任 json 的来源
    • @JeffS 你能解释一下为什么会这样吗?
    • 请看:docs.python.org/library/functions.html#eval 所以json字符串的值被解释为python代码,这意味着你允许代码作为你的程序运行,可能是一个主要的安全问题.
    • 不用eval,看json库。 json.loads() 和 json.dumps() 在 python 对象和 json 字符串之间转换,没有 eval() 的安全问题。否则,这是一个不错的答案,感谢 urllib2 代码,这就是我想要的。
    猜你喜欢
    • 1970-01-01
    • 2018-05-09
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 2014-12-16
    • 2013-01-22
    相关资源
    最近更新 更多