Cách tốt nhất để phân tích một phản hồi JSON từ thư viện yêu cầu là gì?


266

Tôi đang sử dụng requestsmô-đun python để gửi RESTful GET đến máy chủ mà tôi nhận được phản hồi trong JSON. Phản hồi JSON về cơ bản chỉ là một danh sách các danh sách.

Cách tốt nhất để ép buộc phản hồi đối với một đối tượng Python nguyên gốc để tôi có thể lặp lại hoặc in nó ra bằng cách sử dụng pprint?

Câu trả lời:


307

Bạn có thể sử dụng json.loads:

import json
import requests

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

Điều này chuyển đổi một chuỗi nhất định thành một từ điển cho phép bạn truy cập dữ liệu JSON của bạn một cách dễ dàng trong mã của bạn.

Hoặc bạn có thể sử dụng đề xuất hữu ích của @ Martijn và câu trả lời được bình chọn cao hơn , response.json().


3
ok tuyệt vời, tuy nhiên mỗi yếu tố vẫn sẽ là unicode.
felix001

@ felix001: có, mặc dù bạn có thể chuyển đổi bất kỳ dữ liệu nào bằng cách sử dụng str(). Mặt khác, dữ liệu unicode không tệ để có xung quanh (để chuẩn bị cho tương lai).
Simeon Visser

162
Sử dụng nhiều, tốt hơn nhiều response.json(), vì nó sẽ làm tốt hơn việc tìm ra mã hóa được sử dụng. (Khước từ, tôi đã viết một số mã đó).
Martijn Pieters

@MartijnPieters: sau đó làm thế nào tôi có thể sử dụng yêu cầu trình phân tích cú pháp json sau đó trên một văn bản ghi nhớ của phản hồi? tức là có đầu ra của response.text()?
neurino

@MartijnPieters, được tìm thấy:requests.compat.json.loads(resp_text)
neurino

469

Vì bạn đang sử dụng requests, bạn nên sử dụng jsonphương pháp của phản hồi .

import requests

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

tự động phát hiện bộ giải mã nào sẽ sử dụng .


2
Chỉ cần lưu ý rằng nó đã xuất hiện ở đâu đó trong khoảng giữa v0.12 và v1.0 để ví dụ gói gỡ lỗi Ubuntu 12.04 cho các yêu cầu python chưa có chức năng này (đó là v0.8). Bạn có thể pip install requestsmặc dù thay vì sử dụng gói deb.
timurb

5
Tôi hơi tò mò bây giờ datanó là một danh sách các danh sách hoặc một từ điển.
Krishna Oza

6
@Krishna_Oza dataphản ánh cấu trúc của JSON mà nó đang đọc. Ví dụ: nếu phản hồi là : [{"a": {...}}], datalà một danh sách, với list[0] == {'a': {...}}. Nếu phản hồi là {"a": "b", "c": "d"}, datalà một lệnh. Điều đó có trả lời câu hỏi của bạn không?
pswaminathan

1
@CGFoX bạn đang chạy phiên bản nào? Tôi vẫn thấy API hoạt động theo cách tương tự trên phiên bản mới nhất:>>> import requests >>> r = requests.get('http://httpbin.org/get') >>> r.json <bound method Response.json of <Response [200]>> >>> r.json() {'args': {}, ...}
pswaminathan

4
Upvote cho điều này bởi vì tôi thường sử dụng phương thức json.loads (respons.text) cho đến khi trên một số jsons lớn tôi thấy rằng việc sử dụng respons.json () nhanh hơn nhiều so với cách khác.
Paul R.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.