在Python中序列化JSON时,"TypeError:(Integer)不是JSON可序列化的"?

use*_*894 145 python encoding json typeerror

我试图从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()
Run Code Online (Sandbox Code Playgroud)

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

afile.write(json.dumps(alerts,encoding='UTF-8',default=str))
Run Code Online (Sandbox Code Playgroud)

use*_*894 250

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

  • 我也必须处理这个问题,你的回答指出了我正确的方向.我只是想补充[链接到另一个问题(http://stackoverflow.com/questions/9452775/converting-numpy-dtypes-to-native-python-types),可以在实际解决问题的帮助. (19认同)
  • 如果JSON不可序列化的错误消息可以显示对象的类型,那就太好了...... (17认同)
  • 这就是问题所在,但解决方案是什么? (11认同)
  • [Here](http://stackoverflow.com/a/27050186/310441)是一个使用自定义序列化程序的整洁解决方案. (6认同)
  • x.astype(int)或int(x) (4认同)

hsc*_*hsc 35

似乎在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)
Run Code Online (Sandbox Code Playgroud)


use*_*236 12

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

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

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

json.dumps({'value': numpy.int64(42)}, default=convert)
Run Code Online (Sandbox Code Playgroud)


Jon*_*ado 9

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

例如,如果变量x是 int64:

int(x)
Run Code Online (Sandbox Code Playgroud)

如果是 int64 数组:

map(int, x)
Run Code Online (Sandbox Code Playgroud)


Sri*_*mar 6

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


shi*_*iva 5

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

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__()
Run Code Online (Sandbox Code Playgroud)

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


归档时间:

查看次数:

89618 次

最近记录:

6 年,3 月 前