在Python中序列化JSON时,“ TypeError :(整数)不可JSON序列化”?


161

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


1
这似乎并未“复制”该问题..

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

@ user1329894作为解决方案/解释和自我关闭发布..

-0用于编写实际上不会重现该错误的最小化repro。
罗素·博罗戈夫

Answers:


268

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


22
我也必须处理这个问题,您的回答为我指明了正确的方向。我只是想添加指向另一个问题的链接,该链接可以帮助实际解决问题。
JAC

19
如果JSON无法序列化错误消息可以显示对象的类型,
那就太好

6
是一个使用自定义序列化器的整洁解决方案。
Owen

17
那是问题,但是解决方案是什么?
BallpointBen

5
x.astype(int)或int(x)
zelcon

50

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

Serhiy提供了一个很好的解决方法。请检查他的方法。并添加:json.dumps(yourObject,default = default); 像这儿。
普拉内塞尔

4

这为我解决了问题:

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

4

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

例如,如果变量x是int64:

int(x)

如果是int64数组:

map(int, x)

3

正如@JAC在评价最高的答案的注释中指出的那样,可以在将numpy dtypes转换为本地python类型的线程中找到通用解决方案(适用于所有numpy类型) 。

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

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

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

的确是一个不错的答案
jtlz2

2

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

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

通话myconverterjson.dumps()像下面。json.dumps(alerts, default=myconverter).


1

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

df = pd.DataFrame(obj)

然后将其保存dataframejson文件中:

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

希望这可以帮助



0

同样的问题。列出包含numpy.int64类型的数字,该数字引发TypeError。我的快速解决方法是

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

它将列表转换为str(),而eval()函数像python表达式那样评估“字符串”,并在我的情况下以整数列表形式返回结果。


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

0

from numpyencoder import NumpyEncoder

在Python3中解决此问题:

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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.