NumPy数组转JSON格式错误,如何生成符合HTTP请求要求的格式?
解决NumPy数组JSON序列化后HTTP请求格式问题
问题根源
你的问题出在NumPy数组没有被正确转换为原生Python列表,导致序列化后变成了字符串形式的数组,而非JSON数组类型。自定义NpEncoder的实现逻辑或后续数据处理环节可能存在疏漏。
具体解决方案
1. 修正NpEncoder实现,确保转成原生列表
自定义编码器必须将NumPy数组转换为Python原生列表,而非字符串。正确的实现如下:
import json import numpy as np class NpEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, np.ndarray): return obj.tolist() # 核心:将NumPy数组转为Python列表 return super().default(obj)
2. 拆分数组后直接转为Python列表(可选,提前规避序列化问题)
使用np.array_split拆分后,直接对子数组调用tolist(),提前转为原生列表:
# 示例:拆分原始NumPy数组 original_hotels = np.array(["662091", "889933"]) split_result = np.array_split(original_hotels, 1) # 按需求拆分 hotel_list = split_result[0].tolist() # 转为Python列表
3. 正确构造请求体并序列化
构造请求数据时直接使用原生列表,再用修正后的编码器序列化:
payload = { 'hotels': { 'hotel': hotel_list } } # 序列化payload为JSON字符串 json_payload = json.dumps(payload, cls=NpEncoder)
4. 发送请求时避免二次序列化
如果使用requests库,注意两种正确的发送方式:
- 方式一:让
requests自动处理序列化(推荐)import requests requests.post(your_url, json=payload, cls=NpEncoder) - 方式二:手动序列化后发送,需指定请求头
不要同时使用headers = {'Content-Type': 'application/json'} requests.post(your_url, data=json_payload, headers=headers)json参数和手动序列化的data,否则会导致二次序列化,把数组转成字符串。
排查小贴士
如果问题依旧,检查代码中是否有其他环节将列表转为字符串(比如误写str(hotel_list)),或者在传递数据时被其他函数意外修改了类型。
内容的提问来源于stack exchange,提问作者Alexander Bishop
相关产品推荐
相关产品推荐

