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