usuario1329894
Estoy tratando de enviar un diccionario simple a un archivo json desde python, pero sigo recibiendo el mensaje “TypeError: 1425 is not JSON serializable”.
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 cual no es deseable.
afile.write(json.dumps(alerts,encoding='UTF-8',default=str))
usuario1329894
Encontré mi problema. El problema era que mis números enteros en realidad eran de tipo numpy.int64
.
-
Tuve que lidiar con este problema también, y su respuesta me indicó la dirección correcta. Solo quería agregar un enlace a otra pregunta que pueda ayudar a resolver el problema.
– JAC
25 de noviembre de 2013 a las 17:35
-
Sería bueno si el mensaje de error no serializable JSON pudiera mostrar el tipo de objeto…
– Franck Dernoncourt
21 de julio de 2015 a las 19:41
-
Aquí hay una solución ordenada que usa un serializador personalizado.
– Owen
17 de junio de 2016 a las 0:03
-
Ese es el problema, pero ¿cuál es la solución?
– BolígrafoBen
1 de mayo de 2018 a las 16:12
-
x.astype(int) o int(x)
– zelcon
14 de mayo de 2018 a las 9:58
hsc
Parece que puede haber un problema al volcar numpy.int64 en una cadena json en Python 3 y el equipo de python ya tiene una conversación al respecto. Se pueden encontrar más detalles aquí.
Hay una solución proporcionada por Serhiy Storchaka. Funciona muy bien, así que lo pego aquí:
def convert(o):
if isinstance(o, numpy.int64): return int(o)
raise TypeError
json.dumps({'value': numpy.int64(42)}, default=convert)
-
Una maravillosa solución proporcionada por Serhiy. Por favor, compruebe su enfoque. Y para agregar, simplemente: json.dumps(yourObject, default=default); como aquí.
– Pranzell
16 abr 2019 a las 15:30
como señaló @JAC en los comentarios de la respuesta mejor calificada, la solución genérica (para todos los tipos numpy) se puede encontrar en el hilo Convertir numpy dtypes a tipos nativos de python.
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 con las respuestas del otro hilo. Esto debería funcionar con casi todos los tipos numpy.
def convert(o):
if isinstance(o, np.generic): return o.item()
raise TypeError
json.dumps({'value': numpy.int64(42)}, default=convert)
-
Buena respuesta de hecho
– jtlz2
26 de marzo de 2020 a las 12:04
Simplemente convierta números de int64
(de numpy) a int
.
Por ejemplo, si la variable x
es un int64:
int(x)
Si es una matriz de int64:
map(int, x)
Sriram Arvind Lakshmanakumar
Tú tienes Tipo de datos numéricosSolo cambia a normal int()
o float()
tipo de datos. funcionará bien.
Shiva
Esta podría ser la respuesta tardía, pero recientemente recibí el mismo error. Después de mucho navegar, esta solución me ayudó.
alerts = {'upper':[1425],'lower':[576],'level':[2],'datetime':['2012-08-08 15:30']}
def myconverter(obj):
if isinstance(obj, np.integer):
return int(obj)
elif isinstance(obj, np.floating):
return float(obj)
elif isinstance(obj, np.ndarray):
return obj.tolist()
elif isinstance(obj, datetime.datetime):
return obj.__str__()
Llamar myconverter
en json.dumps()
como abajo. json.dumps(alerts, default=myconverter).
Tobias Ernst
Esto resolvió mi problema:
def serialize(self):
return {
my_int: int(self.my_int),
my_float: float(self.my_float)
}
posible duplicado de json.dump arrojando “TypeError: {…} no es JSON serializable” en un objeto aparentemente válido?
– Shiplu Mokaddim
13 de agosto de 2012 a las 21:12
Esto no parece “duplicar” esa pregunta …
– usuario166390
13 de agosto de 2012 a las 21:17
Encontré mi problema. El problema era que mis números enteros en realidad eran de tipo numpy.int64.
– usuario1329894
13 de agosto de 2012 a las 21:18
@ user1329894 Publicar como solución/explicación y cierre automático.
– usuario166390
13 de agosto de 2012 a las 21:19
-0 por escribir una reproducción mínima que en realidad no reproduzca el error.
–Russell Borogove
13 de agosto de 2012 a las 21:39