2011-10-26 11 views
162

Nie jestem pewien, czy rozumiem cel metody flask.jsonify. Staram się ciąg JSON z tego:json.dumps vs flask.jsonify

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

ale co mam z json.dumps różni się od tego, co mam z flask.jsonify.

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

Oczywiście trzeba uzyskać wynik, który wygląda bardziej jak co json.dumps zwrotów. Co ja robię źle?

+2

Pisałem długie pytanie na stronach internetowych i dlaczego "jsonify" nie zwracał poprawnych danych, gdy natknąłem się na to. Okazało się, że 'json.dumps' jest dokładnie tym, czego potrzebowałem. –

Odpowiedz

206

jsonify() funkcja w kolbie zwraca flask.Response() obiekt, który ma już odpowiedni nagłówek Content-Type 'application/json' do stosowania z JSON odpowiedzi. Natomiast metoda json.dumps() po prostu zwróci zakodowany ciąg, co wymagałoby ręcznego dodania nagłówka typu MIME.

Aby uzyskać pełne informacje, zobacz więcej o funkcji jsonify()here.

Edytować: Ponadto zauważyłem, że jsonify() obsługuje kwargs lub słowniki, a json.dumps() dodatkowo obsługuje listy i inne.

+15

'jsonify()' obsługuje teraz listy. Zobacz [to zatwierdzenie] (https://github.com/mitsuhiko/flask/commit/431db2874b242316051963d9bc4d5653b3647acc). –

78

można zrobić:

flask.jsonify(**data) 

lub

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

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

Moduł json stosowany jest albo simplejson lub json w tej kolejności. current_app jest odniesieniem do obiektu Flask(), tj. Twojej aplikacji. response_class() jest odniesieniem do klasy Response().

+2

To powinna być właściwa odpowiedź ... – tyan

20

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

  • jsonify byłyby przydatne podczas budowania kogoś API zapytań i będzie oczekiwać json w zamian. E.g: Interfejs API REST Github może użyć tej metody, aby odpowiedzieć na twoją prośbę.

  • wysypisk, bardziej chodzi o formatowanie danych/python obiektu do JSON, a prace nad nim wewnątrz aplikacji. Na przykład, muszę przekazać obiekt do mojej warstwy reprezentacji, w której niektóre javascript wyświetla wykres. Będziesz podawał javascript z Jsonem generowanym przez zrzuty.

+1

Nie rozumiem różnicy w ogóle. – vidstige

+5

@vidstige: ** jsonify ** tworzy kolbę.Obiekt Response() z nagłówkami ustawionymi jako "content-type: application/json", jego ładunek ustawiony jako konwertowany na ciąg znaków JSON. ** dumps ** po prostu tworzy łańcuch konwertowany na JSON. Nie jest to właściwie sformatowany obiekt flask.Response(). Jeśli więc twój widok mówi "return json.dumps (dict)", odbiorca otrzyma zwykłą odpowiedź "content-type: text/html" z danymi wyjściowymi json.dumps jako ładunku. – SamEsla

Powiązane problemy