在Python中序列化JSON时,“TypeError:(Integer)不是JSON可序列化的”?

时间:2012-08-13 21:10:05

标签: python json encoding typeerror

我正在尝试从python向json文件发送一个简单的字典,但我一直得到“TypeError:1425不是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()

如果我添加了默认参数,那么它会写入,但整数值将作为字符串写入json文件,这是不可取的。

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

10 个答案:

答案 0 :(得分:229)

我发现了我的问题。问题是我的整数实际上是numpy.int64类型。

答案 1 :(得分:22)

似乎可能存在将numpy.int64转储到Python 3中的json字符串中的问题,并且python团队已经就此进行了对话。可以找到更多详细信息here

Serhiy Storchaka提供了一种解决方法。它工作得很好,所以我把它贴在这里:

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

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

答案 2 :(得分:7)

@JAC在评价最高的答案的注释中指出,可以在线程Converting numpy dtypes to native python types中找到通用解决方案(适用于所有numpy类型)。

尽管如此,我将在下面添加我的解决方案版本,因为我需要一个通用的解决方案,该解决方案将这些答案以及其他线程的答案结合在一起。这应该适用于几乎所有的numpy类型。

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

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

答案 3 :(得分:4)

这可能是较晚的响应,但是最近我遇到了相同的错误。经过大量的冲浪之后,此解决方案对我有所帮助。

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

通过myconverter致电json.dumps(),如下所示。 json.dumps(alerts, default=myconverter).

答案 4 :(得分:2)

这为我解决了问题:

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

答案 5 :(得分:1)

只需将数字从int64(从numpy)转换为int

例如,如果变量x是int64:

int(x)

如果是int64数组:

map(int, x)

答案 6 :(得分:1)

同样的问题。列出包含 type numpy.int64 which throws a TypeError 的号码。对我来说,快速的解决方法是

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

它将list转换为str(),而eval()函数像 Python 表达式那样计算 String 并将结果作为list of integers

答案 7 :(得分:0)

您具有Numpy数据类型,只需更改为普通的int()或float()数据类型即可。它会正常工作。

答案 8 :(得分:0)

或者,您可以先将对象转换为数据框:

df = pd.DataFrame(obj)

,然后将此dataframe保存在json文件中:

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

希望这会有所帮助

答案 9 :(得分:0)

使用以下代码解决该问题。

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