json.dumps vs flask.jsonify

276

Não sei se entendi o objetivo do flask.jsonifymétodo. Eu tento fazer uma string JSON com isso:

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

mas o que recebo json.dumpsdifere do que recebo flask.jsonify.

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

Obviamente, preciso obter um resultado que se pareça mais com o que json.dumpsretorna. O que estou fazendo de errado?

Sergei Basharov
fonte

Respostas:

370

A jsonify()função no balão retorna um flask.Response()objeto que já possui o cabeçalho de tipo de conteúdo apropriado 'application / json' para uso com respostas json. Considerando que, o json.dumps()método retornará apenas uma seqüência de caracteres codificada, o que exigiria adicionar manualmente o cabeçalho do tipo MIME.

Veja mais sobre a jsonify()função aqui para referência completa.

Editar: Além disso, notei que jsonify()lida com kwargs ou dicionários, json.dumps()além de suportar listas e outros.

Kenneth Wilke
fonte
31
jsonify()lida com listas agora. Veja este commit .
precisa saber é o seguinte
3
Mas ainda não transforma objetos e listas SQLAlchemy em JSON.
ajbraus
91

Você pode fazer:

flask.jsonify(**data)

ou

flask.jsonify(id=str(album.id), title=album.title)
mikerobi
fonte
82

Isto é 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')

O jsonmódulo usado é simplejsonou jsonnessa ordem. current_appé uma referência ao Flask()objeto, ou seja, seu aplicativo. response_class()é uma referência à Response()classe.

Michael Ekoka
fonte
42

A escolha de um ou outro depende do que você pretende fazer. Pelo que entendi:

  • O jsonify seria útil ao criar uma API que alguém consultaria e esperaria o json em troca. Por exemplo: a API do REST github pode usar esse método para responder à sua solicitação.

  • dumps , é mais sobre a formatação de objeto data / python no json e trabalha nele dentro do seu aplicativo. Por exemplo, preciso passar um objeto para minha camada de representação, onde algum javascript exibirá gráfico. Você alimentará o javascript com o Json gerado por dumps.

chaiyachaiya
fonte
4
Eu não entendo a diferença.
vidstige
11
@vidstige: jsonify cria um objeto flask.Response () com seus cabeçalhos definidos como "content-type: application / json", sua carga útil definida como o ditado convertido para JSON-string. dumps simplesmente cria uma string convertida em JSON. Não é um objeto flask.Response () devidamente formatado. Portanto, se sua visualização diz "retornar json.dumps (dict)", o destinatário receberá apenas uma resposta "tipo de conteúdo: texto / html" regular com a saída json.dumps como carga útil.
SamEsla
3
@ SamEsla sim, eu sei, mas nenhuma dessas informações está nesta resposta.
vidstige
0

considerar

data={'fld':'hello'}

agora

jsonify(data)

produzirá {'fld': 'olá'} e

json.dumps(data)

"<html><body><p>{'fld':'hello'}</p></body></html>"
Govind Kelkar
fonte