我正在尝试从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))
答案 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()