json.dumps vs flask.jsonify


276

ฉันไม่แน่ใจว่าฉันเข้าใจวัตถุประสงค์ของflask.jsonifyวิธีการ ฉันพยายามสร้างสตริง JSON จากสิ่งนี้:

data = {"id": str(album.id), "title": album.title}

แต่สิ่งที่ฉันได้รับกับความแตกต่างจากสิ่งที่ผมได้รับด้วยjson.dumpsflask.jsonify

json.dumps(data): [{"id": "4ea856fd6506ae0db42702dd", "title": "Business"}]
flask.jsonify(data): {"id":…, "title":…}

เห็นได้ชัดว่าฉันต้องได้รับผลลัพธ์ที่ดูเหมือนสิ่งที่json.dumpsส่งคืน ผมทำอะไรผิดหรือเปล่า?

คำตอบ:


369

jsonify()ฟังก์ชั่นในขวดส่งกลับflask.Response()วัตถุที่มีอยู่แล้วส่วนหัวของชนิดเนื้อหาที่เหมาะสม 'application / JSON' สำหรับการใช้งานกับการตอบสนอง JSON ในขณะที่json.dumps()วิธีการก็จะกลับสตริงเข้ารหัสซึ่งจะต้องมีการเพิ่มส่วนหัวประเภท MIME ด้วยตนเอง

ดูเพิ่มเติมเกี่ยวกับjsonify()ฟังก์ชั่นที่นี่สำหรับการอ้างอิงแบบเต็ม

แก้ไข: นอกจากนี้ฉันสังเกตเห็นว่าjsonify()จัดการ kwargs หรือพจนานุกรมในขณะที่json.dumps()ยังสนับสนุนรายการและอื่น ๆ


31
jsonify()จัดการรายการตอนนี้ ดูการกระทำนี้
Jeff Widman

3
แต่ก็ยังไม่เปลี่ยนวัตถุและรายการ SQLAlchemy เป็น JSON
ajbraus


82

นี่คือ flask.jsonify()

def jsonify(*args, **kwargs):
    if __debug__:
        _assert_have_json()
    return current_app.response_class(json.dumps(dict(*args, **kwargs),
        indent=None if request.is_xhr else 2), mimetype='application/json')

jsonโมดูลที่ใช้เป็นทั้งsimplejsonหรือjsonอยู่ในลำดับที่ current_appเป็นการอ้างอิงถึงFlask()วัตถุเช่นใบสมัครของคุณ response_class()เป็นการอ้างอิงถึงResponse()คลาส


42

ตัวเลือกอย่างใดอย่างหนึ่งขึ้นอยู่กับสิ่งที่คุณตั้งใจจะทำ จากสิ่งที่ฉันเข้าใจ:

  • jsonifyจะมีประโยชน์เมื่อคุณกำลังสร้าง API ที่ใครบางคนจะสืบค้นและคาดว่า json จะได้รับผลตอบแทน เช่น: REST github API สามารถใช้วิธีนี้เพื่อตอบคำขอของคุณ

  • ดัมพ์เป็นข้อมูลเพิ่มเติมเกี่ยวกับการจัดรูปแบบ data / python object เป็น json และทำงานกับมันในแอปพลิเคชันของคุณ ตัวอย่างเช่นฉันต้องส่งวัตถุไปยังเลเยอร์การเป็นตัวแทนของฉันซึ่งจาวาสคริปต์บางตัวจะแสดงกราฟ คุณจะป้อน javascript ด้วย Json ที่สร้างโดยทิ้ง


4
ฉันไม่เข้าใจความแตกต่างเลย
vidstige

11
@vidstige: jsonifyทำให้วัตถุ flask.Response () ที่มีส่วนหัวถูกตั้งค่าเป็น "content-type: application / json", ส่วนของข้อมูลจะถูกตั้งค่าเป็นสตริง dict ที่แปลงเป็น JSON ดัมพ์ทำให้การแปลงเป็นสตริง JSON เป็นแบบง่ายๆ ไม่ใช่วัตถุรูปแบบขวดแก้วการตอบสนอง () ดังนั้นหากมุมมองของคุณระบุว่า "return json.dumps (dict)" ดังนั้นผู้รับจะได้รับการตอบสนอง "content-type: text / html" ตามปกติโดยมีเอาต์พุต json.dumps เป็นเพย์โหลด
SamEsla

3
@ SamEsla ใช่ฉันรู้ แต่ไม่มีข้อมูลนั้นในคำตอบนี้
vidstige

0

พิจารณา

data={'fld':'hello'}

ตอนนี้

jsonify(data)

จะให้ผล {'fld': 'hello'} และ

json.dumps(data)

จะช่วยให้

"<html><body><p>{'fld':'hello'}</p></body></html>"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.