2013-06-01 22 views
84

Tôi đang sử dụng trăn requests module để gửi một RESTful GET tới một máy chủ, mà tôi nhận được phản hồi bằng 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 để phân tích cú pháp phản hồi JSON từ thư viện yêu cầu là gì?

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

Trả lời

119

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

import json 
import requests 

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

này chuyển đổi một chuỗi cho trước thành một cuốn từ điển mà 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.

+1

ok tuyệt vời, tuy nhiên mỗi thành phần vẫn sẽ là unicode. – felix001

+0

@ 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 phải là xấu để có xung quanh (để chuẩn bị cho tương lai). –

+52

Nhiều, tốt hơn nhiều khi sử dụng 'response.json()', vì nó sẽ thực hiện * công việc tốt hơn * để tìm ra mã hóa được sử dụng. (Disclaimer, tôi đã viết một số mã đó). –

185

Nếu bạn đang sử dụng Yêu cầu, bạn nên sử dụng phương thức json của phản hồi. Nó guesses which UTF encoding was used if no encoding was specifieduses the simplejson package if it is installed.

import requests 

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

Chỉ cần nhớ rằng nó đã xuất hiện ở đâu đó ở giữa v0.12 và v1.0 sao cho ví dụ gói Debian 12.04 deb cho yêu cầu python không có hàm này (v0.8). Bạn có thể 'pip install requests' thay vì sử dụng gói deb. – timurb

+0

Tôi là một chút tò mò những gì bây giờ 'dữ liệu' là nó một danh sách các danh sách hoặc một từ điển. –

+2

@Krishna_Oza 'dữ liệu' phản ánh cấu trúc của JSON mà nó đang đọc. Ví dụ, nếu đáp ứng là: '[{" a ": {...}}]', 'dữ liệu' là một danh sách, với' danh sách [0] == {'a': {...}} '. Nếu đáp ứng là '{" a ":" b "," c ":" d "}', 'dữ liệu' là một dict. Câu trả lời đó có đáp ứng được câu hỏi của bạn không? – pswaminathan

2

để phân tích một phản ứng như một trong những dưới đây

{ 
    one: { 
     two: { 
      three: "Hello, friend!", 
     } 
    } 
} 

chúng ta có thể làm điều gì đó như

ParsedValue = data['one']['two']['three'] 
print ParsedValue 

Chúc may mắn!

+0

Điều này cho thấy cách lặp qua giá trị đã được phân tích cú pháp, nhưng nó không cho thấy cách phân tích cú pháp từ một chuỗi thành JSON, đó là câu hỏi được đặt ra. –

-1
**#  This code helping to get data or individual fields from url like api url** 
#Get for single field from url 
import requests 
import json 
import urllib 

url="http://api.open-notify.org/iss-pass.json" 
r=requests.get(url) 
t=json.loads(r.content) 
for i in range(len(t)): 
#There is state is field of database 
    print(t[i]['state']) 
+2

Các câu trả lời chỉ có mã không được khuyến khích. Vui lòng chỉnh sửa câu trả lời của bạn và giải thích giải pháp của bạn. –

+0

... và cũng có thể, cách nó khác biệt về mặt vật chất so với các câu trả lời trước - điều này dường như khuyến khích các thực hành được mô tả ngắn gọn hơn trong [câu trả lời được chấp nhận hiện tại] (https://stackoverflow.com/a/16877439/14122) , đó là vật chất tồi tệ hơn [câu trả lời được bầu chọn nhiều nhất hiện nay] (https://stackoverflow.com/a/16877561/14122), lợi dụng hỗ trợ giải mã JSON được xây dựng trong thư viện 'request' hơn. –