“TypeError: (Integer) no es JSON serializable” al serializar JSON en Python?

3 minutos de lectura

avatar de usuario
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))

  • 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

avatar de usuario
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

avatar de usuario
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)

avatar de usuario
Sriram Arvind Lakshmanakumar

Tú tienes Tipo de datos numéricosSolo cambia a normal int() o float() tipo de datos. funcionará bien.

avatar de usuario
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).

avatar de usuario
Tobias Ernst

Esto resolvió mi problema:

def serialize(self):
    return {
        my_int: int(self.my_int), 
        my_float: float(self.my_float)
    }

¿Ha sido útil esta solución?