json.dumps vs jar.jsonify


276

Tôi không chắc chắn tôi hiểu mục đích của flask.jsonifyphương pháp. Tôi cố gắng tạo một chuỗi JSON từ đây:

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

nhưng những gì tôi nhận được json.dumpskhác với những gì tôi nhận được với flask.jsonify.

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

Rõ ràng tôi cần phải có được một kết quả trông giống như những gì json.dumpstrả về. Tôi đang làm gì sai?

Câu trả lời:


369

Các jsonify()chức năng trong bình trả về một flask.Response()đối tượng mà đã có tiêu đề content-type thích hợp 'application / json' để sử dụng với phản ứng json. Trong khi đó, json.dumps()phương thức sẽ chỉ trả về một chuỗi được mã hóa, sẽ yêu cầu thêm tiêu đề loại MIME theo cách thủ công.

Xem thêm về jsonify()chức năng ở đây để tham khảo đầy đủ.

Chỉnh sửa: Ngoài ra, tôi đã nhận thấy rằng jsonify()xử lý kwargs hoặc từ điển, trong khi json.dumps()cũng hỗ trợ danh sách và những người khác.


31
jsonify()xử lý danh sách bây giờ. Xem cam kết này .
Jeff Widman

3
Nhưng nó vẫn không biến các đối tượng và danh sách SQLAlchemy thành JSON.
ajbraus

91

Bạn có thể làm:

flask.jsonify(**data)

hoặc là

flask.jsonify(id=str(album.id), title=album.title)

82

Đây là 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')

Các jsonmô-đun được sử dụng là simplejsonhoặc jsontheo thứ tự đó. current_applà một tham chiếu đến Flask()đối tượng tức là ứng dụng của bạn. response_class()là một tài liệu tham khảo cho Response()lớp.


42

Sự lựa chọn của cái này hay cái khác phụ thuộc vào những gì bạn định làm. Từ những gì tôi hiểu:

  • jsonify sẽ hữu ích khi bạn đang xây dựng API mà ai đó sẽ truy vấn và mong đợi json trở lại. Ví dụ: API github REST có thể sử dụng phương thức này để trả lời yêu cầu của bạn.

  • kết xuất , là nhiều hơn về việc hình thành dữ liệu / đối tượng python thành json và hoạt động trên nó trong ứng dụng của bạn. Chẳng hạn, tôi cần chuyển một đối tượng đến lớp đại diện của mình, nơi một số javascript sẽ hiển thị biểu đồ. Bạn sẽ cung cấp javascript với Json được tạo bởi các bãi.


4
Tôi không hiểu sự khác biệt nào cả.
vidstige

11
@vidstige: jsonify tạo một đối tượng jar.Response () với các tiêu đề của nó được đặt là "kiểu nội dung: application / json", tải trọng của nó được đặt thành lệnh chính tả được chuyển đổi thành chuỗi JSON. kết xuất chỉ đơn giản là tạo một chuỗi chuyển đổi thành JSON. Đây không phải là một đối tượng jar.Response () được định dạng đúng. Vì vậy, nếu chế độ xem của bạn nói "return json.dumps (dict)", thì người nhận sẽ chỉ nhận được phản hồi "kiểu nội dung: văn bản / html" thông thường với đầu ra json.dumps dưới dạng tải trọng.
SamEsla

3
@SamEsla vâng, tôi biết, nhưng không có thông tin nào trong câu trả lời này.
vidstige

0

xem xét

data={'fld':'hello'}

hiện nay

jsonify(data)

sẽ mang lại {'fld': 'xin chào'} và

json.dumps(data)

cho

"<html><body><p>{'fld':'hello'}</p></body></html>"
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.