Tengo un marco de datos que almacena el nombre de la tienda y el recuento de ventas diarias. Estoy tratando de insertar esto en Salesforce usando el script de Python a continuación.
Sin embargo, me sale el siguiente error:
TypeError: Object of type 'int64' is not JSON serializableA continuación, se muestra la vista del marco de datos.
Storename,Count Store A,10 Store B,12 Store C,5Uso el siguiente código para insertarlo en 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)Recibo el error cuando se ejecuta la última línea anterior.
¿Cómo puedo solucionar esto?
json no reconoce los tipos de datos NumPy. Convierta el número a un Python int antes de serializar el objeto:
'count__c': int(store['count'].iloc[i])Puede definir su propio codificador para resolver este problema.
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)Lanzaré mi respuesta al anillo como una versión un poco más estable de la excelente solución de @Jie Yang.
numpyencoder y su repositorio .
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) Si profundiza en el código de hmallen en el archivo numpyencoder/numpyencoder.py , verá que es muy similar a la respuesta de @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)