"TypeError: (Integer) is not JSON serializable" when serializing JSON in Python?

PythonJsonEncodingTypeerror

Python 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

Just convert numbers from int64 (from numpy) to int.

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser1329894View Question on Stackoverflow
Solution 1 - Pythonuser1329894View Answer on Stackoverflow
Solution 2 - PythonhscView Answer on Stackoverflow
Solution 3 - PythonBuggyView Answer on Stackoverflow
Solution 4 - PythonJonatas EduardoView Answer on Stackoverflow
Solution 5 - PythonSriram Arvind LakshmanakumarView Answer on Stackoverflow
Solution 6 - PythonshivaView Answer on Stackoverflow
Solution 7 - PythonTobias ErnstView Answer on Stackoverflow
Solution 8 - Pythonuser319436View Answer on Stackoverflow
Solution 9 - PythonkartikView Answer on Stackoverflow
Solution 10 - Pythonkrishna kumar mishraView Answer on Stackoverflow