189

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

10 回答 10

297

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

于 2012-08-13T21:36:25.820 回答
67

似乎在 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)
于 2018-05-29T06:32:46.623 回答
12

正如@JAC 在最高评价答案的评论中指出的那样,通用解决方案(适用于所有 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)
于 2020-01-09T05:52:31.247 回答
10

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

例如,如果变量x是 int64:

int(x)

如果是 int64 数组:

map(int, x)
于 2019-06-04T17:11:43.887 回答
7

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

于 2018-08-28T15:50:55.233 回答
6

This might be the late response, but recently i got the same error. After lot of surfing this solution helped me.

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

Call myconverter in json.dumps() like below. json.dumps(alerts, default=myconverter).

于 2020-02-24T13:18:13.063 回答
4

这为我解决了这个问题:

def serialize(self):
    return {
        my_int: int(self.my_int), 
        my_float: float(self.my_float)
    }
于 2019-04-07T20:43:23.713 回答
3

同样的问题。列出包含的数量type numpy.int64 which throws a TypeError。对我来说快速的解决方法是

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

它转换liststr()和函数像Pythoneval()表达式一样评估字符串,并在我的情况下以 a 形式返回结果。list of integers

于 2020-04-24T00:00:07.627 回答
1

使用以下代码解决问题。

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()
于 2020-06-01T05:25:17.337 回答
1

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

df = pd.DataFrame(obj)

然后将其保存dataframejson文件中:

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

希望这可以帮助

于 2018-10-30T12:46:22.650 回答