json.dumps vs flask.jsonify


276

flask.jsonifyYöntemin amacını anladığımdan emin değilim . Bundan bir JSON dizesi yapmaya çalışıyorum:

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

ama elde ettiğim, aldığımdan json.dumpsfarklı flask.jsonify.

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

Açıkçası neyin json.dumpsgeri döndüğüne benzeyen bir sonuç almam gerekiyor . Neyi yanlış yapıyorum?

Yanıtlar:


370

Şişedeki jsonify()işlev flask.Response(), zaten json yanıtlarıyla kullanılmak üzere uygun içerik türü üstbilgisi 'application / json' olan bir nesneyi döndürür . Oysajson.dumps() yöntem yalnızca MIME türü üstbilgisinin manuel olarak eklenmesini gerektiren kodlanmış bir dize döndürür.

Tam referans için jsonify()işlevle ilgili daha fazla bilgiyi burada bulabilirsiniz .

Düzenleme: Ayrıca, ek olarak listeleri ve diğerlerini desteklerken jsonify(), kwargs veya sözlükleri işlediğini fark ettim json.dumps().


31
jsonify()listeleri şimdi işler. Bkz bu taahhüt .
Jeff Widman

3
Ancak yine de SQLAlchemy nesnelerini ve listelerini JSON'a dönüştürmez.
ajbraus

91

Yapabilirsin:

flask.jsonify(**data)

veya

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

82

Bu 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')

Kullanılan jsonmodül ya simplejsonya jsonda bu sıradadır. nesneye, yani uygulamanıza current_appbir referanstır Flask(). sınıfa response_class()bir referanstır Response().


42

Bir veya diğerinin seçimi ne yapmak istediğinize bağlıdır. Anladığım kadarıyla:

  • jsonify , birisi sorgulayacak ve karşılığında json bekleyecek bir API oluştururken yararlı olacaktır. Örneğin: REST github API, isteğinizi yanıtlamak için bu yöntemi kullanabilir.

  • dökümler , daha çok veri / python nesnesini json olarak biçimlendirmek ve uygulamanızın üzerinde çalışmakla ilgilidir. Örneğin, bazı javascript grafik görüntüleyecek benim temsil katmanına bir nesne geçirmek gerekir. Javascript'i dökümler tarafından oluşturulan Json ile besleyeceksiniz.


4
Farkı hiç anlamıyorum.
vidstige

11
@vidstige: jsonify , üstbilgileri "content-type: application / json" olarak ayarlanmış, yükü JSON dizesine dönüştürülmüş dikte olarak ayarlanmış bir flask.Response () nesnesi oluşturur. dumps basitçe JSON dizesine dönüştürülür. Düzgün biçimlendirilmiş bir flask.Response () nesnesi değil. Dolayısıyla, görünümünüzde "return json.dumps (dict)" yazıyorsa, alıcı yük olarak json.dumps çıktısıyla düzenli bir "content-type: text / html" yanıtı alır.
SamEsla

3
@SamEsla evet, biliyorum, ama bu bilgilerin hiçbiri bu cevapta yok.
vidstige

0

düşünmek

data={'fld':'hello'}

şimdi

jsonify(data)

{'fld': 'merhaba'} verir ve

json.dumps(data)

verir

"<html><body><p>{'fld':'hello'}</p></body></html>"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.