在 Python 中序列化 JSON 时,“ TypeError: (Integer) is not JSON Series alable”?

我试图从 python 发送一个简单的字典到一个 JSON 文件,但是我总是收到“ TypeError: 1425 is not JSON Series alable”消息。

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))
160032 次浏览

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

在 Python 3中将 numpy.int64转储到 json 字符串中似乎有问题,Python 团队已经就此进行了讨论。更多细节可以找到 给你

Serhiy Storchaka 提供了一个变通方法,它工作得很好,所以我把它粘贴到这里:

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


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

你有 数据类型,只是改变到正常的 int()float()数据类型。它会工作得很好。

或者你可以先把你的对象转换成一个数据框架:

df = pd.DataFrame(obj)

然后将这个 dataframe保存到一个 json文件中:

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

希望这个能帮上忙

这解决了我的问题:

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

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

例如,如果变量 x是 int64:

int(x)

If 是 int64数组:

map(int, x)

正如@JAC 在评分最高答案的评论中指出的那样,通用解决方案(对于所有数字类型)可以在线程 将 numpy dtype 转换为本机 python 类型中找到。

不过,我将在下面添加我的解决方案版本,因为在我的例子中,我需要一个将这些答案和另一个线程的答案组合在一起的通用解决方案。这应该适用于几乎所有的麻木类型。

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


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

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

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

同样的问题。列表中包含 type numpy.int64 which throws a TypeError的编号。我的快速解决办法是

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

它将 list转换为 str(),并且 eval()函数像 巨蟒表达式一样计算 绳子,并且在我的例子中将结果作为 list of integers返回。

使用下面的代码解决问题。

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