Apa cara terbaik untuk mem-parse respons JSON dari pustaka permintaan?

266

Saya menggunakan requestsmodul python untuk mengirim RESTful GET ke server, yang saya dapatkan responsnya di JSON. Respons JSON pada dasarnya hanyalah daftar daftar.

Apa cara terbaik untuk memaksa respons ke objek Python asli sehingga saya bisa beralih atau mencetaknya menggunakan pprint?

felix001
sumber

Jawaban:

307

Anda bisa menggunakan json.loads:

import json
import requests

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

Ini mengonversi string yang diberikan ke kamus yang memungkinkan Anda untuk mengakses data JSON Anda dengan mudah dalam kode Anda.

Atau Anda dapat menggunakan saran bermanfaat @ Martijn, dan jawaban yang dipilih lebih tinggi response.json(),.

Simeon Visser
sumber
3
ok hebat, namun masing-masing elemen akan tetap unicode.
felix001
@ felix001: ya, meskipun Anda dapat mengonversi data apa pun menggunakan str(). Di sisi lain, unicode data tidak buruk untuk dimiliki (dalam persiapan untuk masa depan).
Simeon Visser
162
Jauh, jauh lebih baik untuk digunakan response.json(), karena itu akan melakukan pekerjaan yang lebih baik untuk mencari tahu pengkodean yang digunakan. (Penafian, saya menulis beberapa kode itu).
Martijn Pieters
@ MartijnPieters: lalu bagaimana saya bisa menggunakan permintaan json parser nanti pada teks jawaban memcached? yaitu memiliki output response.text()?
neurino
@ MartijnPieters, ditemukan:requests.compat.json.loads(resp_text)
neurino
469

Karena Anda menggunakan requests, Anda harus menggunakan metode respons json.

import requests

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

Ini mendeteksi secara otomatis decoder mana yang akan digunakan .

pswaminathan
sumber
2
Hanya perlu diingat bahwa ia telah muncul di suatu tempat di antara v0.12 dan v1.0 sehingga misalnya paket deb Ubuntu 12,04 untuk permintaan python belum memiliki fungsi ini (ini adalah v0.8). Namun Anda dapat pip install requestsbukannya menggunakan paket deb.
timurb
5
Saya sedikit ingin tahu apa yang sekarang dataadalah daftar daftar atau kamus.
Krishna Oza
6
@ Krishna_Oza datamencerminkan struktur JSON yang dibacanya. Misalnya, jika respon: [{"a": {...}}], dataadalah daftar, dengan list[0] == {'a': {...}}. Jika responsnya adalah {"a": "b", "c": "d"}, dataadalah dict. Apakah itu menjawab pertanyaan Anda?
pswaminathan
1
@CGFoX versi apa yang Anda jalankan? Saya masih melihat API bekerja dengan cara yang sama pada versi terbaru:>>> import requests >>> r = requests.get('http://httpbin.org/get') >>> r.json <bound method Response.json of <Response [200]>> >>> r.json() {'args': {}, ...}
pswaminathan
4
Suara positif untuk ini karena saya biasanya menggunakan metode json.loads (response.text) sampai pada beberapa jsons besar saya menemukan bahwa menggunakan respons.json () jauh lebih cepat daripada cara lain.
Paul R.