"TypeError: (Integer) is not JSON serializable" when serializing JSON in Python?
PythonJsonEncodingTypeerrorPython Problem Overview
I am trying to send a simple dictionary to a json file from python, but I keep getting the "TypeError: 1425 is not JSON serializable" message.
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()
If I add the default argument, then it writes, but the integer values are written to the json file as strings, which is undesirable.
afile.write(json.dumps(alerts,encoding='UTF-8',default=str))
Python Solutions
Solution 1 - Python
I found my problem. The issue was that my integers were actually type numpy.int64
.
Solution 2 - Python
It seems like there may be a issue to dump numpy.int64 into json string in Python 3 and the python team already have a conversation about it. More details can be found here.
There is a workaround provided by Serhiy Storchaka. It works very well so I paste it here:
def convert(o):
if isinstance(o, numpy.int64): return int(o)
raise TypeError
json.dumps({'value': numpy.int64(42)}, default=convert)
Solution 3 - Python
as @JAC pointed out in the comments of the highest rated answer, the generic solution (for all numpy types) can be found in the thread https://stackoverflow.com/questions/9452775/converting-numpy-dtypes-to-native-python-types.
Nevertheless, I´ll add my version of the solution below, as my in my case I needed a generic solution that combines these answers and with the answers of the other thread. This should work with almost all numpy types.
def convert(o):
if isinstance(o, np.generic): return o.item()
raise TypeError
json.dumps({'value': numpy.int64(42)}, default=convert)
Solution 4 - Python
int64
(from numpy) to int
.
Just convert numbers from For example, if variable x
is a int64:
int(x)
If is array of int64:
map(int, x)
Solution 5 - Python
You have Numpy Data Type, Just change to normal int()
or float()
data type. it will work fine.
Solution 6 - Python
This might be the late response, but recently i got the same error. After lot of surfing this solution helped me.
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__()
Call myconverter
in json.dumps()
like below. json.dumps(alerts, default=myconverter).
Solution 7 - Python
This solved the problem for me:
def serialize(self):
return {
my_int: int(self.my_int),
my_float: float(self.my_float)
}
Solution 8 - Python
Same problem. List contained numbers of type numpy.int64 which throws a TypeError
. Quick workaround for me was to
mylist = eval(str(mylist_of_integers))
json.dumps({'mylist': mylist})
which converts list
to str()
and eval()
function evaluates the String like a Python expression and returns the result as a list of integers
in my case.
Solution 9 - Python
Alternatively you can convert your object into a dataframe first:
df = pd.DataFrame(obj)
and then save this dataframe
in a json
file:
df.to_json(path_or_buf='df.json')
Hope this helps
Solution 10 - Python
Use the below code to resolve the issue.
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()