You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:15:37