如何让AWS Lambda返回的farms字段为JSON而非字符串?
解决Lambda+API Gateway返回JSON数组时的日期序列化问题
方案1:在Lambda中预处理日期字段,直接返回数组
核心思路是把查询结果中的datetime类型字段转换为JSON可序列化的格式(比如ISO字符串),然后直接返回包含数组的字典,无需对farms字段单独做json.dumps。
- 编写日期转换辅助函数:
import datetime def convert_serializable(data): if isinstance(data, list): return [convert_serializable(item) for item in data] elif isinstance(data, dict): processed = {} for key, value in data.items(): if isinstance(value, datetime.datetime): processed[key] = value.isoformat() elif isinstance(value, (list, dict)): processed[key] = convert_serializable(value) else: processed[key] = value return processed elif isinstance(data, datetime.datetime): return data.isoformat() return data
- 修改Lambda函数逻辑:
def get_all_farms(self, event, context): params = event["queryParams"] offset = int(params["offset"] or 0) max = int(params["max"] or 20) result = db.get_all_farms_paginated(offset, max) # 处理结果中的日期字段 processed_farms = convert_serializable(result) return { "error": False, "message": "success", "farms": processed_farms }
这样返回的farms是原生数组,API Gateway会自动将整个响应序列化为正确的JSON结构,最终返回的响应中farms就是JSON数组而非字符串。
方案2:使用Lambda代理集成(简化配置)
如果可以调整API Gateway的集成模式为代理模式,Lambda返回的字典会被API Gateway直接作为响应体处理,同样需要先处理日期字段。
修改CDK中的集成配置:
myfarm_resource.add_method( "GET", integration=apigateway.LambdaIntegration( api_lambda_myfarm, proxy=True, # 改为代理模式 ), method_responses=[ apigateway.MethodResponse( status_code="200", ) ], )
Lambda函数的处理逻辑和方案1一致,预处理日期后直接返回字典即可。代理模式下无需配置请求/响应模板,配置更简洁。
问题根源说明
- 直接返回
result:查询结果中包含datetime等不可JSON序列化的类型,API Gateway在序列化响应时会抛出转换错误。 - 使用
json.dumps(result):将数组转为字符串后放入响应字典,API Gateway序列化整个字典时,会把这个字符串再次转义,导致farms字段是带转义符的字符串而非数组。
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

