Respostas:
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_ascii
comportamento. 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
As funções com s
parâmetros de seqüência de caracteres take. Os outros recebem fluxos de arquivos.
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.
Uma diferença notável no Python 2 é que, se você estiver usando ensure_ascii=False
, dump
gravará 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):
dumps
por outro lado, com ensure_ascii=False
pode produzir um str
ou unicode
apenas 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
unicode
instância .
(ênfase minha). Observe que ainda pode ser uma str
instâ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 load
vs loads
, load
considera 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.
json.dumps([b'123'])
-> TypeError
.