Qual é a diferença entre json.dump () e json.dumps () em python?


131

Busquei no presente documento oficial para encontrar diferença entre o json.dump () e json.dumps () em python. É claro que eles estão relacionados à opção de gravação de arquivo.
Mas qual é a diferença detalhada entre eles e em que situações um tem mais vantagem que outro?

Respostas:


146

Não há muito mais a acrescentar além do que dizem os documentos. Se você deseja despejar o JSON em um arquivo / soquete ou qualquer outra coisa, então você deve prosseguir dump(). Se você precisar apenas dele como uma sequência (para impressão, análise ou o que for), use dumps()(sequência de despejo)

Como mencionado por Antii Haapala nesta resposta , existem algumas pequenas diferenças no ensure_asciicomportamento. Isso se deve principalmente à maneira como a write()função subjacente funciona, sendo que ela opera em partes, e não na cadeia inteira. Veja a resposta dele para mais detalhes.

json.dump()

Serialize obj como um fluxo formatado em JSON para fp (a .write () - suportando objeto semelhante a arquivo

Se sure_ascii for False, alguns chunks gravados em fp podem ser instâncias unicode

json.dumps()

Serialize obj a um str formatado em JSON

Se sure_ascii for False, o resultado poderá conter caracteres não ASCII e o valor de retorno poderá ser uma instância unicode


Você pode mostrar um exemplo de como usar dump () para enviar pelo soquete? Eu sei que posso usar dumps () e encode () para converter em bytes, mas existe alguma maneira mais curta?
— Garoto

37

As funções com sparâmetros de seqüência de caracteres take. Os outros recebem fluxos de arquivos.


20

No uso de memória e velocidade.

Quando você o chama jsonstr = json.dumps(mydata), primeiro cria uma cópia completa dos seus dados na memória e somente então você file.write(jsonstr)o envia para o disco. Portanto, esse é um método mais rápido, mas pode ser um problema se você tiver um grande volume de dados para salvar.

Quando você chama json.dump(mydata, file)- sem 's', a nova memória não é usada, pois os dados são despejados por pedaços. Mas todo o processo é cerca de 2 vezes mais lento.

Fonte: Eu verifiquei o código fonte de json.dump()e json.dumps()e também testou ambas as variantes medir o tempo com time.time()e vendo o uso de memória no htop.


6

Uma diferença notável no Python 2 é que, se você estiver usando ensure_ascii=False, dumpgravará corretamente os dados codificados em UTF-8 no arquivo (a menos que você tenha usado cadeias de 8 bits com caracteres estendidos que não sejam UTF-8):

dumpspor outro lado, com ensure_ascii=Falsepode produzir um strou unicodeapenas dependendo de quais tipos você usou para seqüências de caracteres:

Serialize obj para um str formatado em JSON usando esta tabela de conversão. Se sure_ascii for False, o resultado poderá conter caracteres não ASCII e o valor de retorno poderá ser uma unicodeinstância .

(ênfase minha). Observe que ainda pode ser uma strinstância também.

Portanto, você não pode usar seu valor de retorno para salvar a estrutura em um arquivo sem verificar com qual formato foi retornado e possivelmente brincando unicode.encode.

É claro que isso não é mais uma preocupação válida no Python 3, já que não há mais essa confusão de 8 bits / Unicode.


Quanto ao loadvs loads, loadconsidera o arquivo inteiro como um documento JSON, portanto, não é possível usá-lo para ler vários documentos JSON limitados por nova linha a partir de um único arquivo.


Todo o texto criado em um objeto de string python é unicode, mas é seguro assumir isso genericamente? ou seja, ao carregar o conteúdo de um arquivo?
— João Gonçalves

@ JoãoGonçalves significa que você não pode misturar dados binários com texto, para que o python os aprove silenciosamente. por exemplo json.dumps([b'123'])-> TypeError.
— Antti Haapala

O @ JoãoGonçalves também observa que as strings nos documentos JSON devem ser Unicode e devem estar em qualquer um dos UTF-8, UTF-16 ou UTF-32 de acordo com a RFC 7159
— Antti Haapala

1
Obrigado por essa explicação! Faz sentido
— João Gonçalves
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.