2016-03-17 16 views

risposta

43

Non c'è altro da aggiungere se non quello che dicono i documenti, se si desidera eseguire il dump del JSON in un file/socket o qualsiasi altra cosa, si consiglia di andare su dump(). Se avete solo bisogno come una stringa (per la stampa, l'analisi o qualsiasi altra cosa) quindi utilizzare dumps() (stringa discarica)

Come menzionato da Antii Haapala in this answer, ci sono alcune piccole differenze sul comportamento ensure_ascii, questo è in gran parte a causa di come il sottostante La funzione write() funziona, poiché funziona in blocchi anziché nell'intera stringa, controlla la risposta per ulteriori dettagli.

json.dump()

Serialize obj come un flusso JSON formattato fp (un .write() - sostenere file come oggetto

Se ensure_ascii è falso, alcuni pezzi scritti fp possono essere casi in unicode

json.dumps()

obj Serialize ad una str JSON formattato

Se ensure_ascii è falso, il risultato può contenere caratteri non-ASCII e il valore di ritorno può essere un esempio unicode

11

Le funzioni con un s parametri take stringa. Gli altri prendono i file flussi.

4

Una differenza notevole in Python 2 è che se si sta utilizzando ensure_ascii=False, dump scriverà correttamente UTF-8 dati codificati nel file (a meno che non si è utilizzato 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 solo a seconda di quali tipi che hai usato per le stringhe:

Serialize obj ad una str JSON formattato con questa tabella di conversione . Se ensure_ascii è False, il risultato potrebbe contenere caratteri non ASCII e il valore restituito potrebbe essere un'istanza.

(sottolineatura mia). Si noti che potrebbe anche essere un'istanza str.

Quindi non è possibile utilizzare il suo valore di ritorno per salvare la struttura in un file senza verificare quale formato è stato restituito ed è possibile giocare con 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 il file intera essere un documento JSON, quindi non è possibile utilizzarlo per leggere più di nuova riga documenti JSON limitati da un singolo file.

+0

Tutto il testo creato in un oggetto stringa python è unicode, ma è sicuro assumerlo genericamente? vale a dire quando si carica il contenuto da un file? –

+0

@ JoãoGonçalves significa che non è possibile combinare dati binari con il testo in modo che Python lo approvi in ​​modo silenzioso. per esempio. 'json.dumps ([b'123 '])' -> 'TypeError'. –

+0

@ JoãoGonçalves notano anche che le stringhe nei documenti JSON ** devono essere Unicode ** e ** devono essere ** in qualsiasi UTF-8, UTF-16 o UTF-32 in base a RFC 7159 –

Problemi correlati