首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python - JSON:'int64‘类型的对象不可序列化

Python - JSON:'int64‘类型的对象不可序列化
EN

Stack Overflow用户
提问于 2018-06-19 03:39:16
回答 8查看 147.8K关注 0票数 129

我有一个存储商店名称和每日销售计数的数据框架。我正在尝试使用下面的Python脚本将其插入到Salesforce中。

但是,我得到以下错误:

代码语言:javascript
复制
TypeError: Object of type 'int64' is not JSON serializable

下面是数据框的视图。

代码语言:javascript
复制
Storename,Count
Store A,10
Store B,12
Store C,5

我使用以下代码将其插入到Salesforce中。

代码语言:javascript
复制
update_list = []
for i in range(len(store)):
    update_data = {
        'name': store['entity_name'].iloc[i],
        'count__c': store['count'].iloc[i] 
    }
    update_list.append(update_data)

sf_data_cursor = sf_datapull.salesforce_login()
sf_data_cursor.bulk.Account.update(update_list)

当上面的最后一行被执行时,我得到了错误。

我该如何解决这个问题?

EN

回答 8

Stack Overflow用户

发布于 2018-06-19 04:07:03

json不识别NumPy数据类型。在序列化对象之前,将数字转换为Python int

代码语言:javascript
复制
'count__c': int(store['count'].iloc[i])
票数 145
EN

Stack Overflow用户

发布于 2019-09-13 06:29:54

你可以定义你自己的编码器来解决这个问题。

代码语言:javascript
复制
import json
import numpy as np

class NpEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.integer):
            return int(obj)
        if isinstance(obj, np.floating):
            return float(obj)
        if isinstance(obj, np.ndarray):
            return obj.tolist()
        return super(NpEncoder, self).default(obj)

# Your codes .... 
json.dumps(data, cls=NpEncoder)
票数 105
EN

Stack Overflow用户

发布于 2020-05-20 10:08:53

我将把我对ring的回答作为@Jie Yang的excellent solution的一个更稳定的版本。

我的解决方案

numpyencoderits repository

代码语言:javascript
复制
from numpyencoder import NumpyEncoder

numpy_data = np.array([0, 1, 2, 3])

with open(json_file, 'w') as file:
    json.dump(numpy_data, file, indent=4, sort_keys=True,
              separators=(', ', ': '), ensure_ascii=False,
              cls=NumpyEncoder)

细目

如果你深入研究numpyencoder/numpyencoder.py文件中的hmallen's代码,你会发现它与@Jie Yang的答案非常相似:

代码语言:javascript
复制
class NumpyEncoder(json.JSONEncoder):
    """ Custom encoder for numpy data types """
    def default(self, obj):
        if isinstance(obj, (np.int_, np.intc, np.intp, np.int8,
                            np.int16, np.int32, np.int64, np.uint8,
                            np.uint16, np.uint32, np.uint64)):

            return int(obj)

        elif isinstance(obj, (np.float_, np.float16, np.float32, np.float64)):
            return float(obj)

        elif isinstance(obj, (np.complex_, np.complex64, np.complex128)):
            return {'real': obj.real, 'imag': obj.imag}

        elif isinstance(obj, (np.ndarray,)):
            return obj.tolist()

        elif isinstance(obj, (np.bool_)):
            return bool(obj)

        elif isinstance(obj, (np.void)): 
            return None

        return json.JSONEncoder.default(self, obj)
票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50916422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档