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

Flask的request.get_json无法反序列化嵌套字典?解析报错求助

问题描述

需要发送嵌套字典格式的请求数据,手动做了序列化操作,请求数据示例:

req = {
    "data": {
      "field1": 420000,
      "field2": 3,
      "field3": 6840
    },
    "weights": {
      "weight1": 1,
      "weight2": 1,
      "weight3": 1
    },
    "num_trials": 15
}

客户端发送请求的代码:

def to_serialize_nestd_dict(val):
    if hasattr(val, '__dict__'):
        return val.__dict__

    return val

@lambdawarmer.warmer(send_metric=False)
def lambda_handler(event, context):
    json_str = json.dumps(event, default=to_serialize_nestd_dict)
    res = requests.post(url=f'http://{SERVER_IP}:5084/predict',
                        data=json_str,
                        headers={"Content-Type": "application/json"}
                       )

服务端Flask解析请求的代码:

from flask import request
client_req = request.get_json(silent=False)

尝试获取client_req["data"]时,始终报错:

Key Error: 'data'

疑惑Flask的get_json()是否无法反序列化嵌套字典,寻求确认和解决办法。

问题分析与解决
  • Flask的get_json()完全支持嵌套字典的反序列化,问题根源不在Flask的反序列化能力上。
  • 核心问题大概率出在客户端发送的数据上:
    1. 代码中序列化的是Lambda的event参数,但示例中的请求数据是req字典。如果event的结构和req不一致,甚至不包含data字段,那服务端自然取不到这个键。你应该确保发送的是预期的req数据,比如把json.dumps(event)改成json.dumps(req)(如果req在Lambda函数内定义),或者确认event确实包含data等所需字段。
    2. 自定义的to_serialize_nestd_dict函数可能会破坏数据结构:如果event里包含带有__dict__属性的对象,这个函数会把对象转成字典,但如果event本身就是普通字典,这个函数完全没必要,反而可能在某些场景下导致序列化异常。如果不需要处理自定义对象,建议去掉default=to_serialize_nestd_dict参数,直接使用json.dumps()序列化普通字典。
  • 验证步骤:
    • 在客户端打印json_str,检查实际发送的JSON字符串是否包含data字段,结构是否符合预期。
    • 在服务端先打印request.data,查看原始请求体内容,确认和客户端发送的一致。

内容的提问来源于stack exchange,提问作者PhysicsMath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:35:10