¿Cuál es la diferencia entre json.dump () y json.dumps () en python?


131

Busqué en este documento oficial para encontrar la diferencia entre json.dump () y json.dumps () en python. Está claro que están relacionados con la opción de escritura de archivos.
Pero, ¿cuál es la diferencia detallada entre ellos y en qué situaciones uno tiene más ventaja que otro?

Respuestas:


146

No hay mucho más que agregar aparte de lo que dicen los documentos. Si desea volcar el JSON en un archivo / socket o lo que sea, entonces debe ir con dump(). Si solo lo necesita como una cadena (para imprimir, analizar o lo que sea), use dumps()(volcar cadena)

Como mencionó Antii Haapala en esta respuesta , hay algunas diferencias menores en el ensure_asciicomportamiento. Esto se debe principalmente a cómo write()funciona la función subyacente , ya que opera en fragmentos en lugar de en toda la cadena. Verifique su respuesta para obtener más detalles al respecto.

json.dump()

Serialice obj como una secuencia con formato JSON a fp (a .write () - compatible con un objeto similar a un archivo

Si sure_ascii es False, algunos fragmentos escritos en fp pueden ser instancias unicode

json.dumps()

Serializar obj a un str con formato JSON

Si sure_ascii es False, el resultado puede contener caracteres no ASCII y el valor de retorno puede ser una instancia unicode


¿Puedes mostrar un ejemplo sobre cómo usar dump () para enviar a través del socket? Sé que puedo usar dumps () y luego encode () para convertir a bytes, pero ¿hay alguna forma más corta?
Niño

37

Las funciones con una stoma de parámetros de cadena. Los otros toman secuencias de archivos.


20

En uso de memoria y velocidad.

Cuando lo llama jsonstr = json.dumps(mydata)primero crea una copia completa de sus datos en la memoria y solo entonces ustedfile.write(jsonstr) envía al disco. Por lo tanto, este es un método más rápido, pero puede ser un problema si tiene una gran cantidad de datos para guardar.

Cuando llama json.dump(mydata, file), sin 's', no se utiliza memoria nueva, ya que los datos son volcados por fragmentos. Pero todo el proceso es aproximadamente 2 veces más lento.

Fuente: Verifiqué el código fuente de json.dump()y json.dumps()también probé las dos variantes que miden el tiempo time.time()y observan el uso de la memoria en htop.


6

Una diferencia notable en Python 2 es que si estás usando ensure_ascii=False,dump escribirá correctamente los datos codificados UTF-8 en el archivo (a menos que haya utilizado cadenas de 8 bits con caracteres extendidos que no sean UTF-8):

dumpspor otro lado, con ensure_ascii=Falsepuede producir un stro unicodesolo dependiendo de los tipos que usó para las cadenas:

Serialice el obj a una cadena con formato JSON utilizando esta tabla de conversión. Si sure_ascii es False, el resultado puede contener caracteres no ASCII y el valor de retorno puede ser una unicodeinstancia .

(énfasis mío). Tenga en cuenta que aún puede ser una strinstancia también.

Por lo tanto, no puede usar su valor de retorno para guardar la estructura en un archivo sin verificar qué formato se devolvió y posiblemente jugar con él unicode.encode.

Esto, por supuesto, ya no es una preocupación válida en Python 3, ya que no hay más esta confusión de 8 bits / Unicode.


En cuanto a loadvs loads, loadconsidera que todo el archivo es un documento JSON, por lo que no puede usarlo para leer varios documentos JSON limitados de nueva línea de un solo archivo.


Todo el texto creado en un objeto de cadena de Python es unicode, pero ¿es seguro asumirlo genéricamente? es decir, al cargar contenido de un archivo?
João Gonçalves

@ JoãoGonçalves significa que no puede mezclar datos binarios con texto para que Python lo apruebe en silencio. p.ejjson.dumps([b'123']) -> TypeError.
Antti Haapala

@ JoãoGonçalves también nota que las cadenas en los documentos JSON deben ser Unicode , y deben estar en cualquiera de UTF-8, UTF-16 o UTF-32 de acuerdo con RFC 7159
Antti Haapala

1
Gracias por esa explicación! Tiene sentido
João Gonçalves
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.