Risposte:
Non c'è molto altro da aggiungere se non quello che dicono i documenti. Se vuoi scaricare JSON in un file / socket o altro, allora dovresti andare con dump()
. Se ti serve solo come stringa (per la stampa, l'analisi o altro), usa dumps()
(stringa di dump)
Come menzionato da Antii Haapala in questa risposta , ci sono alcune piccole differenze nel ensure_ascii
comportamento. Ciò è dovuto principalmente al modo in cui write()
funziona la funzione sottostante , in quanto opera su blocchi piuttosto che sull'intera stringa. Controlla la sua risposta per maggiori dettagli al riguardo.
json.dump()
Serializza obj come stream formattato JSON su fp (a .write () - che supporta un oggetto simile a un file
Se sure_ascii è False, alcuni blocchi scritti in fp potrebbero essere istanze unicode
json.dumps()
Serializza obj su una str in formato JSON
Se sure_ascii è False, il risultato può contenere caratteri non ASCII e il valore restituito può essere un'istanza unicode
Le funzioni con i s
parametri di una stringa take. Gli altri accettano flussi di file.
In uso della memoria e velocità.
Quando lo chiami jsonstr = json.dumps(mydata)
prima crea una copia completa dei tuoi dati in memoria e solo allora tufile.write(jsonstr)
su disco. Quindi questo è un metodo più veloce ma può essere un problema se hai un grosso pezzo di dati da salvare.
Quando chiami json.dump(mydata, file)
- senza "s", la nuova memoria non viene utilizzata, poiché i dati vengono scaricati da blocchi. Ma l'intero processo è circa 2 volte più lento.
Fonte: ho controllato il codice sorgente di json.dump()
ejson.dumps()
anche testato entrambe le varianti misurando il tempo con time.time()
e guardando l'utilizzo della memoria in htop.
Una notevole differenza in Python 2 è che se stai usando ensure_ascii=False
,dump
scriverà correttamente i dati codificati UTF-8 nel file (a meno che tu non abbia usato stringhe a 8 bit con caratteri estesi che non sono UTF-8):
dumps
d'altra parte, con ensure_ascii=False
può produrre un str
o unicode
semplicemente a seconda di quali tipi hai usato per le stringhe:
Serializza obj su una str formattata JSON usando questa tabella di conversione. Se sure_ascii è False, il risultato può contenere caratteri non ASCII e il valore restituito può essere
unicode
un'istanza .
(enfasi mia). Si noti che potrebbe anche essere str
un'istanza.
Pertanto, non è possibile utilizzare il valore restituito per salvare la struttura in un file senza controllare con quale formato è stato restituito ed eventualmente giocare unicode.encode
.
Questo ovviamente non è più un problema valido in Python 3, poiché non c'è più questa confusione a 8 bit / Unicode.
Per quanto riguarda load
vs loads
, load
considera l' intero file come un documento JSON, quindi non è possibile utilizzarlo per leggere più documenti JSON limitati di nuova riga da un singolo file.
json.dumps([b'123'])
-> TypeError
.