json.dumps vs flask.jsonify

276

Nie jestem pewien, czy rozumiem cel flask.jsonifymetody. Próbuję utworzyć ciąg JSON z tego:

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

ale to, co otrzymuję, json.dumpsróżni się od tego, co otrzymuję flask.jsonify.

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

Oczywiście muszę uzyskać wynik, który bardziej przypomina json.dumpszwrot. Co ja robię źle?

Siergiej Baszarow
źródło

Odpowiedzi:

369

jsonify()Działają w kolbie zwraca się flask.Response()obiekt, który ma już odpowiedni nagłówek Content-Type „application / json” do stosowania w reakcji JSON. Zważywszy, że json.dumps()metoda będzie po prostu wrócić zakodowany ciąg, który musiałby ręcznie dodając nagłówek typu MIME.

Więcej informacji na temat tej jsonify()funkcji można znaleźć tutaj .

Edycja: Zauważyłem również, że jsonify()obsługuje kwargs lub słowniki, a json.dumps()dodatkowo obsługuje listy i inne.

Kenneth Wilke
źródło
31
jsonify()obsługuje teraz listy. Zobacz to zatwierdzenie .
Jeff Widman
3
Ale nadal nie zamienia obiektów i list SQLAlchemy w JSON.
ajbraus
91

Możesz to zrobić:

flask.jsonify(**data)

lub

flask.jsonify(id=str(album.id), title=album.title)
mikerobi
źródło
82

To jest 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')

jsonModuł używany jest albo simplejsonczy jsonw tej kolejności. current_appjest odniesieniem do Flask()obiektu, tj. Twojej aplikacji. response_class()jest odniesieniem do Response()klasy.

Michael Ekoka
źródło
42

Wybór jednego lub drugiego zależy od tego, co zamierzasz zrobić. Z tego co rozumiem:

  • jsonify byłby przydatny, gdy budujesz API, ktoś zapytałby i oczekiwałby json w zamian. Np .: Interfejs API github REST mógłby użyć tej metody do odpowiedzi na twoje żądanie.

  • zrzuca , chodzi bardziej o formowanie obiektu danych / python w json i pracę nad nim w aplikacji. Na przykład muszę przekazać obiekt do mojej warstwy reprezentacji, w której jakiś skrypt JavaScript wyświetli wykres. Będziesz karmić javascript Jsonem generowanym przez zrzuty.

chaiyachaiya
źródło
4
W ogóle nie rozumiem różnicy.
vidstige
11
@vidstige: jsonify tworzy obiekt flask.Response () z nagłówkami ustawionymi jako „content-type: application / json”, a jego ładunek ustawiony jako dict-przekonwertowany na JSON-string. zrzuty po prostu tworzą ciąg przekonwertowany na JSON. To nie jest poprawnie sformatowany obiekt flask.Response (). Więc jeśli twój widok mówi „return json.dumps (dict)”, to odbiorca otrzyma zwykłą odpowiedź „content-type: text / html” z danymi wyjściowymi json.dumps jako ładunkiem.
SamEsla,
3
@SamEsla tak, wiem, ale żadnej z tych informacji nie ma w tej odpowiedzi.
vidstige
0

rozważać

data={'fld':'hello'}

teraz

jsonify(data)

przyniesie {'fld': 'hello'} i

json.dumps(data)

daje

"<html><body><p>{'fld':'hello'}</p></body></html>"
Govind Kelkar
źródło