在 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”