วิธีที่ดีที่สุดในการแยกการตอบสนอง JSON จากห้องสมุดขอคืออะไร?


266

ฉันใช้requestsโมดูลหลามเพื่อส่ง RESTful GET ไปยังเซิร์ฟเวอร์ซึ่งฉันได้รับการตอบกลับใน JSON การตอบสนอง JSON นั้นเป็นเพียงรายการ

เป็นวิธีที่ดีที่สุดในการบีบบังคับการตอบสนองต่อวัตถุพื้นเมืองหลามดังนั้นฉันสามารถทำซ้ำหรือพิมพ์โดยใช้pprintอะไร

คำตอบ:


307

คุณสามารถใช้json.loads:

import json
import requests

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

สิ่งนี้จะแปลงสตริงที่กำหนดเป็นพจนานุกรมซึ่งช่วยให้คุณเข้าถึงข้อมูล JSON ของคุณได้อย่างง่ายดายภายในรหัสของคุณ

หรือคุณสามารถใช้คำแนะนำที่เป็นประโยชน์ของ @ Martijn และคำตอบที่ได้รับการโหวตresponse.json()มากขึ้น


3
เยี่ยมมาก แต่องค์ประกอบแต่ละอย่างยังคงเป็นยูนิโค้ด
felix001

@ felix001: ใช่ แต่คุณสามารถแปลงข้อมูลใด ๆ str()ที่ใช้ ในทางตรงกันข้ามข้อมูลยูนิโค้ดก็ไม่เลวที่จะมีรอบ (ในการเตรียมการในอนาคต)
Simeon Visser

162
ดีกว่ามากใช้ดีกว่าresponse.json()เพราะมันจะทำงานได้ดีขึ้นในการหาการเข้ารหัสที่ใช้ (ข้อจำกัดความรับผิดชอบฉันเขียนรหัสบางส่วน)
Martijn Pieters

@MartijnPieters: ถ้าอย่างนั้นฉันจะใช้ json parser ได้อย่างไรในข้อความ memcached ของการตอบกลับ? เช่นมีผลลัพธ์ของresponse.text()?
neurino

@MartijnPieters พบ:requests.compat.json.loads(resp_text)
neurino

469

เนื่องจากคุณกำลังใช้requestsคุณควรใช้การตอบสนองของjsonวิธีการ

import requests

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

มันautodetects ซึ่งถอดรหัสกับการใช้งาน


2
เพียงจำไว้ว่ามันจะปรากฏที่ใดที่หนึ่งในระหว่าง v0.12 และ v1.0 ดังนั้นตัวอย่างเช่นอูบุนตู 12.04 deb-package สำหรับการร้องขอหลามยังไม่ได้มีฟังก์ชั่นนี้ (มันเป็น v0.8) คุณสามารถpip install requestsแทนการใช้แพคเกจ deb
timurb

5
ฉันอยากรู้ว่าตอนนี้dataชื่อลิสต์หรือพจนานุกรมคืออะไร
กฤษณะ Oza

6
@Krishna_Oza dataสะท้อนโครงสร้างของ JSON ที่อ่านอยู่ ตัวอย่างเช่นถ้าการตอบสนองคือ[{"a": {...}}], คือรายการที่มีdata list[0] == {'a': {...}}ถ้าตอบเป็น{"a": "b", "c": "d"}, dataเป็น Dict นั่นตอบคำถามของคุณหรือไม่
pswaminathan

1
@CGFoX คุณใช้เวอร์ชันอะไรอยู่ ฉันยังคงเห็นว่า API ทำงานในลักษณะเดียวกันกับเวอร์ชันล่าสุด:>>> import requests >>> r = requests.get('http://httpbin.org/get') >>> r.json <bound method Response.json of <Response [200]>> >>> r.json() {'args': {}, ...}
pswaminathan

4
โหวตขึ้นสำหรับเรื่องนี้เพราะฉันมักจะใช้วิธีการ json.loads (response.text) จนกระทั่งใน jsons ขนาดใหญ่บางฉันพบว่าการใช้ respons.json () นั้นเร็วกว่าวิธีอื่น
Paul R.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.