在 Python 中序列化 JSON 时出现“TypeError: (Integer) is not JSON serializable”?

Posted

技术标签:

【中文标题】在 Python 中序列化 JSON 时出现“TypeError: (Integer) is not JSON serializable”?【英文标题】:"TypeError: (Integer) is not JSON serializable" when serializing JSON in Python? 【发布时间】:2012-08-10 03:47:44 【问题描述】:

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

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

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

【问题讨论】:

json.dump throwing "TypeError: ... is not JSON serializable" on seemingly valid object? 的可能重复项 这似乎没有“重复”那个问题.. 我发现了我的问题。问题是我的整数实际上是 numpy.int64 类型。 @user1329894 作为解决方案/解释发布并自行关闭 .. -0 用于编写不会实际重现错误的最小重现。 【参考方案1】:

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

【讨论】:

我也必须处理这个问题,您的回答为我指明了正确的方向。我只是想添加a link to another question,它可以帮助实际解决问题。 如果 JSON 不可序列化的错误信息能显示对象的类型就好了…… Here 是一个使用自定义序列化程序的整洁解决方案。 这就是问题所在,但解决方案是什么? x.astype(int) 或 int(x)【参考方案2】:

似乎在 Python 3 中将 numpy.int64 转储为 json 字符串可能存在问题,python 团队已经就此进行了对话。更多详情请见here。

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

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

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

【讨论】:

Serhiy 提供的绝妙解决方法。请检查他的方法。要添加,只需: json.dumps(yourObject, default=default);喜欢这里。【参考方案3】:

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

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

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

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

【讨论】:

确实不错的答案【参考方案4】:

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

例如,如果变量 x 是 int64:

int(x)

如果是 int64 数组:

map(int, x)

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

这可能是迟到的反应,但最近我得到了同样的错误。经过大量冲浪后,此解决方案对我有所帮助。

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

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

【讨论】:

【参考方案7】:

这解决了我的问题:

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

【讨论】:

【参考方案8】:

同样的问题。列表包含 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 返回.

【讨论】:

刚刚注意到 eval(str()) 非常慢,因此请谨慎使用。 @shiva 的回答要好得多: json.dumps(alerts, default=myconverter)【参考方案9】:

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

df = pd.DataFrame(obj)

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

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

希望对你有帮助

【讨论】:

【参考方案10】:

使用以下代码解决问题。

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

【讨论】:

以上是关于在 Python 中序列化 JSON 时出现“TypeError: (Integer) is not JSON serializable”?的主要内容,如果未能解决你的问题,请参考以下文章

Newtonsoft.Json.JsonSerializationException:'反序列化对象时出现意外标记:使用动态对象注释

反序列化类时出现“Newtonsoft.Json.JsonSerializationException 无法找到用于类型的构造函数”错误

使用 NSDictionary 访问 JSON 序列化时出现异常

C#对 Json的序列化和反序列化时出现“k_BackingField”

Spring boot,Jackson Json 在序列化和反序列化时出现问题

创建 Luigi 任务图时出现 JSON 序列化错误