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

dar*_*rse 19 python salesforce pandas

我有一个Dataframe存储商店名称和每日销售数量.我试图使用下面的Python脚本将其插入Salesforce.但是我收到了一个错误

TypeError:'int64'类型的对象不是JSON可序列化的

下面给出的是Dataframe的视图

Storename,Count
Store A,10
Store B, 12
Store C, 5
Run Code Online (Sandbox Code Playgroud)

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

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

获取上面最后一行执行的错误.谁能协助解决这个问题.谢谢..

map*_*arr 31

实际上,不需要编写编码器,只需将默认值更改为str调用json.dumps函数时即可自行处理大多数类型,因此只需一行代码即可:

\n
json.dumps(data, default=str)\n
Run Code Online (Sandbox Code Playgroud)\n

json.dumps来自和的文档json.dump:\n https://docs.python.org/3/library/json.html#json.dump

\n
\n

如果指定,默认值应该是一个为可以\xe2\x80\x99t否则被序列化的对象调用的函数。它应该返回对象的 JSON 可编码版本或引发 TypeError。如果未指定,则会引发 TypeError。

\n
\n

因此调用str将 numpy 类型(例如 numpy ints 或 numpy floats)转换为可以由 json 解析的字符串。如果您有 numpy 数组或范围,则必须首先将它们转换为列表。在这种情况下,按照杨杰的建议编写一个编码器可能是一个更合适的解决方案。

\n

  • 优秀的解决方案。然而,一个缺点是 numpy 数组返回时不带分隔符,例如“[0 1 3]”。不过,由于 json 列表通常有一个逗号作为分隔符,可以在第二步中添加它。 (2认同)

DYZ*_*DYZ 30

json无法识别NumPy数据类型.int在序列化对象之前将数字转换为Python :

'count__c': int(store['count'].iloc[i])
Run Code Online (Sandbox Code Playgroud)


Jas*_*CFA 27

我将把我的回答作为@Jie Yang优秀解决方案的更稳定版本。

我的解决方案

numpyencoder其存储库

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

故障

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


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


con*_*mak 17

一个非常简单的 numpy 编码器可以更一般地实现类似的结果。

请注意,这使用了np.generic类(大多数 np 类继承自)并使用了a.item()方法。

如果要编码的对象不是 numpy 实例,则 json 序列化程序将照常继续。这对于包含一些 numpy 对象和一些其他类对象的字典是理想的。

import json
import numpy as np

def np_encoder(object):
    if isinstance(object, np.generic):
        return object.item()

json.dumps(obj, default=np_encoder)
Run Code Online (Sandbox Code Playgroud)

  • 简短而简洁。 (2认同)
  • 这是更通用和简短的解决方案,对我有用。 (2认同)

Tha*_*dra 16

如果你要序列化一个 numpy 数组,你可以简单地使用ndarray.tolist()方法。

来自numpy 文档

a.tolist()与 几乎相同list(a),只是tolist将 numpy 标量更改为 Python 标量

In [1]: a = np.uint32([1, 2])

In [2]: type(list(a)[0])
Out[2]: numpy.uint32

In [3]: type(a.tolist()[0])
Out[3]: int
Run Code Online (Sandbox Code Playgroud)

  • 这是我的原因和简单的解决方法。事实上,编写编码器将 np 数组转换为列表是矫枉过正的。谢谢 (3认同)

小智 6

You can define your own encoder to solve this problem.

import json
import numpy as np

class NpEncoder(json.JSONEncoder):
    def default(self, 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()
        else:
            return super(NpEncoder, self).default(obj)

# Your codes .... 
json.dumps(data, cls=NpEncoder)
Run Code Online (Sandbox Code Playgroud)

  • 我还需要添加 ``elif isinstance(obj, np.bool_): return bool(obj)``` (4认同)
  • 我已经编辑了这个答案,以删除不必要的“elifs”,因为有回报。 (3认同)
  • @IvanCamilitoRamirezVerdes 这正是我正在寻找的东西,所以对我来说非常有帮助。我也喜欢将编码类放入“json.dumps”函数中的可读性。 (2认同)
  • 对于大多数情况来说,这是相当矫枉过正的。[Tharindu Sathischandra 的解决方案](/sf/ask/3564149571/​​t64-is-not-json-serialized/66345356#66345356) 更简单。 (2认同)

shi*_*iva 6

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

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)

myconverter像下面这样 打电话json.dumps()json.dumps('message', default=myconverter)


Max*_*chi 5

这是一个处理 bool 和 NaN 值的版本 - 它们不是 JSON 规范的一部分 - as null

import json
import numpy as np

class NpJsonEncoder(json.JSONEncoder):
  """Serializes numpy objects as json."""

  def default(self, obj):
    if isinstance(obj, np.integer):
      return int(obj)
    elif isinstance(obj, np.bool_):
      return bool(obj)
    elif isinstance(obj, np.floating):
      if np.isnan(obj):
        return None  # Serialized as JSON null.
      return float(obj)
    elif isinstance(obj, np.ndarray):
      return obj.tolist()
    else:
      return super().default(obj)

# Your code ... 
json.dumps(data, cls=NpEncoder)
Run Code Online (Sandbox Code Playgroud)