2009-10-28 21 views
38

Bunun basit bir cevabı olması gerektiğini düşünüyorum, ancak şu an mücadele ediyorum: Bir url (json çıktıları) almak ve verileri python'da kullanılabilir bir sözlükte almak istiyorum . Son adımda sıkıştım.Json verilerini url aracılığıyla alın ve python'da kullanın (simplejson)

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

Hata yaptığım herhangi bir fikir var mı?

+3

Önce basit şeyler: pasajdaki f.read() yalnızca açıklama amaçlıdır, değil mi? Sorulmasının nedeni, eğer amaçlanan kodun bir parçası ise, bunun f'yi "boşaltır", dolayısıyla ValueError w/simplejason'un etkisi vardır. – mjv

+1

django.utils.simplejson kullanımdan kaldırılmıştır; yerine json kullanın. – ifischer

cevap

43

() ilk f.read çalıştırmadan

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

deneyin. F.read() komutunu çalıştırdığınızda, filehandle'ın içeriği slurped olduğundan, aramanız simplejson.load(f)

+1

Teşekkür ederim - Verileri görebildiğimden emin olmak için adım adım atıyordum ... tabii ki, 'read()' hakkında yeterince şey bilmiyorsun! Teşekkürler. – thornomad

+0

Python 3'te, simplejson json ile değiştirilir ve bayttan bir dönüşüme ihtiyacı vardır. data = json.loads (str (opener.open (req) .read(), "utf-8")) UTF-8 kodlu yanıt için çalışacaktır. – Mead

+2

nit yukarıda - "utf-8" dönüşümü "load" ile değil "str" ​​(en azından python 2.7.3) ile gider. ~ 'Data = json.loads (str (opener.open (req) .read()) , "utf-8") ' –

10

ilk satırda kaldığında ilk satır tüm dosyayı okur. İkinci satır sonra dosyadan fazla okumak etmeye çalışır, ancak bir şey kalmadı:

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

Ya sadece f.read() satırını boş veya okuma değeri kaydedin ve yükleri kullanmak:

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

Daha da kolay bir yol var - hiç basit bir şeye ihtiyacın yok. Python, doğru/yanlış/null değerini doğru değerlere ayarladığınız sürece jsonu bir deyim/dizi olarak değerlendirebilir.

# 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

Bu, json kaynağına kesinlikle güvenmenizi gerektirir – JeffS

+0

@ JeffS Bunun nedenini açıklayabilir misiniz? – Amanda

+4

Lütfen bakınız: http://docs.python.org/library/functions.html#eval Böylece json dizesinin değeri python kodu olarak yorumlanır, bu da kodun programınız olarak çalıştırılmasına izin verdiğiniz anlamına gelir. ve büyük bir güvenlik sorunu olabilir. – JeffS