İstek kitaplığından bir JSON yanıtını ayrıştırmanın en iyi yolu nedir?


266

Python kullanıyorum requests JSON bir yanıt almak bir sunucuya RESTful GET göndermek modülünü . JSON yanıtı temelde sadece bir liste listesidir.

Yerel bir Python nesnesine yanıtı zorlamanın en iyi yolu nedir, böylece yineleyebilir veya kullanarak yazdırabilirim pprint?

Yanıtlar:


307

Şunları kullanabilirsiniz json.loads:

import json
import requests

response = requests.get(...)
json_data = json.loads(response.text)

Bu, belirli bir dizeyi JSON verilerinize kodunuzda kolayca erişmenizi sağlayan bir sözlüğe dönüştürür.

Ya da @ Martijn'in yararlı önerisini ve daha yüksek oy alan cevabı kullanabilirsiniz response.json().


3
Tamam harika, ancak öğelerin her biri hala unicode olurdu.
felix001

@ felix001: evet, ancak kullanarak herhangi bir veri dönüştürebilirsiniz str(). Öte yandan, unicode verilerinin bulunması kötü değildir (geleceğe hazırlık olarak).
Simeon Visser

162
Kullanılan kodlamayı bulmak response.json()için daha iyi bir iş yapacağından, kullanımı çok daha iyi . (Feragat, bu kodun bir kısmını yazdım).
Martijn Pieters

@MartijnPieters: o zaman daha sonra yanıtın memcached metni üzerinde json ayrıştırıcı isteklerini nasıl kullanabilirim? yani çıktısı olan response.text()?
neurino

@MartijnPieters, bulunan:requests.compat.json.loads(resp_text)
neurino

469

Kullandığınız requestsiçin yanıt jsonyöntemini kullanmalısınız .

import requests

response = requests.get(...)
data = response.json()

Bu kullanım için olan dekoderin otomatik olarak tespit .


2
Sadece v0.12 ve v1.0 arasında bir yerde göründüğünü unutmayın, böylece python istekleri için Ubuntu 12.04 deb-paketi henüz bu işleve sahip değildir (v0.8). pip install requestsDeb paketini kullanmak yerine kullanabilirsiniz .
timurb

5
Biraz merak ediyorum şu an dataliste veya sözlük listesi.
Krishna Oza

6
@ Krishna_Oza data, okuduğu JSON'un yapısını yansıtır. Örneğin, yanıt: ise [{"a": {...}}], dataile bir listedir list[0] == {'a': {...}}. Yanıtı ise {"a": "b", "c": "d"}, datadict olduğunu. sorunuza cevap veriyor mu?
pswaminathan

1
@CGFoX Hangi sürümü kullanıyorsunuz? Hala son sürümü aynı şekilde API çalışma görüyorum:>>> import requests >>> r = requests.get('http://httpbin.org/get') >>> r.json <bound method Response.json of <Response [200]>> >>> r.json() {'args': {}, ...}
pswaminathan

4
Bunun için oy verin çünkü genellikle büyük jsons.json () kullanmanın diğer yoldan çok daha hızlı olduğunu buldum kadar json.loads (response.text) yöntemini kullanıyordum.
Paul
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.