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

