Estoy tratando de enviar un diccionario simple a un archivo json desde python, pero sigo recibiendo el mensaje "TypeError: 1425 no es serializable JSON".
import json
alerts = {'upper':[1425],'lower':[576],'level':[2],'datetime':['2012-08-08 15:30']}
afile = open('test.json','w')
afile.write(json.dumps(alerts,encoding='UTF-8'))
afile.close()
Si agrego el argumento predeterminado, escribe, pero los valores enteros se escriben en el archivo json como cadenas, lo que no es deseable.
afile.write(json.dumps(alerts,encoding='UTF-8',default=str))
Respuestas:
Encontré mi problema. El problema era que mis enteros eran realmente de tipo
numpy.int64
.fuente
Parece que puede haber un problema al volcar numpy.int64 en la cadena json en Python 3 y el equipo de Python ya tiene una conversación al respecto. Más detalles se pueden encontrar aquí .
Hay una solución provista por Serhiy Storchaka. Funciona muy bien, así que lo pego aquí:
fuente
Esto resolvió mi problema:
fuente
Simplemente convierta números de
int64
(de numpy) aint
.Por ejemplo, si variable
x
es un int64:Si es una matriz de int64:
fuente
Como @JAC señaló en los comentarios de la respuesta mejor calificada, la solución genérica (para todos los tipos de numpy) se puede encontrar en el hilo Conversión de tipos de numpy a tipos de python nativos .
Sin embargo, agregaré mi versión de la solución a continuación, ya que en mi caso necesitaba una solución genérica que combine estas respuestas y las respuestas del otro hilo. Esto debería funcionar con casi todos los tipos numpy.
fuente
Esta podría ser la respuesta tardía, pero recientemente recibí el mismo error. Después de mucho navegar, esta solución me ayudó.
Llamar
myconverter
enjson.dumps()
como a continuación.json.dumps(alerts, default=myconverter).
fuente
Alternativamente, puede convertir su objeto en un marco de datos primero:
y luego guarde esto
dataframe
en unjson
archivo:Espero que esto ayude
fuente
Tiene el tipo de datos Numpy, simplemente cambie al tipo de datos int () o float () normal. Funcionará bien.
fuente
El mismo problema. La lista contenía números de tipo numpy.int64 que arroja un TypeError. Una solución rápida para mí fue
que convierte la lista en str () y la función eval () evalúa la "Cadena" como una expresión de python y, en mi caso, devuelve el resultado como una lista de enteros.
fuente
utilizar
para resolver este problema en Python3:
fuente