"TypeError: (Integer) non è serializzabile JSON" durante la serializzazione di JSON in Python?


162

Sto cercando di inviare un semplice dizionario a un file JSON da Python, ma continuo a ricevere il messaggio "TypeError: 1425 non è serializzabile 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()

Se aggiungo l'argomento predefinito, allora scrive, ma i valori interi vengono scritti nel file json come stringhe, il che è indesiderabile.

afile.write(json.dumps(alerts,encoding='UTF-8',default=str))


1
Questo non sembra "duplicare" quella domanda ..

8
Ho trovato il mio problema Il problema era che i miei numeri interi erano in realtà di tipo numpy.int64.
user1329894,

@ user1329894 Pubblica come soluzione / spiegazione e chiusura automatica ..

-0 per la scrittura di una riproduzione minima che in realtà non riproduce il bug.
Russell Borogove,

Risposte:


268

Ho trovato il mio problema Il problema era che i miei numeri interi erano effettivamente di tipo numpy.int64.


22
Ho dovuto affrontare anche questo problema e la tua risposta mi ha indicato la giusta direzione. Volevo solo aggiungere un link a un'altra domanda che può aiutare a risolvere effettivamente il problema.
JAC,

19
Sarebbe bello se il messaggio di errore non serializzabile JSON potesse visualizzare il tipo di oggetto ...
Franck Dernoncourt,

6
Ecco una soluzione ordinata che utilizza un serializzatore personalizzato.
Owen,

17
Questo è il problema, ma qual è la soluzione?
BallpointBen,

5
x.astype (int) o int (x)
zelcon,

50

Sembra che potrebbe esserci un problema a scaricare numpy.int64 nella stringa json in Python 3 e il team python ha già una conversazione al riguardo. Maggiori dettagli possono essere trovati qui .

C'è una soluzione alternativa fornita da Serhiy Storchaka. Funziona molto bene, quindi lo incollo qui:

def convert(o):
    if isinstance(o, numpy.int64): return int(o)  
    raise TypeError

json.dumps({'value': numpy.int64(42)}, default=convert)

Una soluzione alternativa meravigliosa fornita da Serhiy. Si prega di controllare il suo approccio. E per aggiungere, basta: json.dumps (yourObject, default = default); come qui.
Pranzell,

4

Questo ha risolto il problema per me:

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

4

Converti i numeri da int64(da numpy) a int.

Ad esempio, se la variabile xè un int64:

int(x)

Se è una matrice di int64:

map(int, x)

3

come sottolineato da @JAC nei commenti della risposta con il punteggio più alto, la soluzione generica (per tutti i tipi numpy) può essere trovata nel thread Conversione di tipi numpy in tipi nativi di pitone .

Tuttavia, aggiungerò la mia versione della soluzione di seguito, poiché nel mio caso avevo bisogno di una soluzione generica che combini queste risposte e le risposte dell'altro thread. Questo dovrebbe funzionare con quasi tutti i tipi intorpiditi.

def convert(o):
    if isinstance(o, np.generic): return o.item()  
    raise TypeError

json.dumps({'value': numpy.int64(42)}, default=convert)

Bella risposta davvero
jtlz2

2

Questa potrebbe essere la risposta tardiva, ma recentemente ho avuto lo stesso errore. Dopo molta navigazione questa soluzione mi ha aiutato.

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__()

Chiamata myconvertera json.dumps()come qui di seguito.json.dumps(alerts, default=myconverter).


1

In alternativa puoi prima convertire il tuo oggetto in un dataframe:

df = pd.DataFrame(obj)

e quindi salvalo dataframein un jsonfile:

df.to_json(path_or_buf='df.json')

Spero che questo ti aiuti



0

Stesso problema. L'elenco conteneva numeri di tipo numpy.int64 che genera un TypeError. Per me era una soluzione rapida

mylist = eval(str(mylist_of_integers))
json.dumps({'mylist': mylist})

che converte la lista in str () e la funzione eval () valuta la "stringa" come un'espressione python e restituisce il risultato come un elenco di numeri interi nel mio caso.


Ho appena notato che eval (str ()) è molto lento, quindi usalo con cautela. La risposta di @ shiva è molto migliore: json.dumps (avvisi, impostazione predefinita = myconverter)
user319436

0

uso

from numpyencoder import NumpyEncoder

per risolvere questo problema in Python3:

import json
from numpyencoder import NumpyEncoder
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',cls=NumpyEncoder))
afile.close()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.