C# Lambda函数中如何用Newtonsoft将JSON字符串转为列表型JSON对象
解决Lambda API返回标准JSON数组响应的问题
核心问题分析
你当前的问题是手动拼接了单个实体的JSON字符串,而非将整个列表/Response对象一次性序列化为标准JSON结构,导致返回的是无数组包裹的拼接字符串(比如{"Email":"xxx"}{"Message":"xxx"}),而非符合要求的JSON对象/数组。
解决方案步骤
1. 确保实体类可正确转为字典
无论你用普通类还是数据类,都要保证每个实体能转为字典结构,方便后续统一序列化:
方式一:使用dataclasses(推荐,简洁)
from dataclasses import dataclass, asdict import json @dataclass class FailedTenant: Email: str Message: str @dataclass class FailedWaterMeter: MeterId: str Message: str @dataclass class Response: failed_tenants: list[FailedTenant] failed_water_meters: list[FailedWaterMeter]
方式二:普通类自定义to_dict方法
import json class FailedTenant: def __init__(self, email, message): self.Email = email self.Message = message def to_dict(self): return {"Email": self.Email, "Message": self.Message} class FailedWaterMeter: def __init__(self, meter_id, message): self.MeterId = meter_id self.Message = message def to_dict(self): return {"MeterId": self.MeterId, "Message": self.Message} class Response: def __init__(self): self.failed_tenants = [] self.failed_water_meters = [] def to_dict(self): return { "failed_tenants": [item.to_dict() for item in self.failed_tenants], "failed_water_meters": [item.to_dict() for item in self.failed_water_meters] }
2. 统一序列化整个Response对象,而非拼接单个JSON
在Lambda处理函数中,不要循环序列化单个实体再拼接,而是将整个Response对象转为字典后一次性序列化为JSON字符串:
def lambda_handler(event, context): # 模拟业务逻辑:收集失败的租户/水表数据 failed_tenants = [FailedTenant("tanmay@yopmail.com", "Email already exist")] failed_water_meters = [FailedWaterMeter("M1001", "Meter ID invalid")] # 构建Response实例 response = Response(failed_tenants=failed_tenants, failed_water_meters=failed_water_meters) # 如果用普通类,替换为: # response = Response() # response.failed_tenants.extend(failed_tenants) # 将Response转为字典并序列化为JSON # 用dataclass则用asdict(response),普通类用response.to_dict() response_dict = asdict(response) # 普通类替换为response.to_dict() response_body = json.dumps(response_dict, default=str) # default=str处理日期等特殊类型 # 返回Lambda API网关要求的标准响应格式 return { "statusCode": 200, "headers": { "Content-Type": "application/json" }, "body": response_body }
3. 关键注意事项
- 禁止手动拼接JSON字符串:循环中每次
json.dumps(item)再拼接会生成非法JSON,必须将整个列表/Response作为一个整体序列化。 - 符合API网关响应格式:Lambda返回的响应必须包含
statusCode、指定Content-Type: application/json的headers,以及序列化后的body。 - 处理特殊类型:如果实体类包含datetime、UUID等JSON无法直接序列化的类型,需在
json.dumps中添加default=str或自定义序列化函数。
最终返回的JSON示例
上述代码会返回如下标准JSON结构:
{ "failed_tenants": [ {"Email":"tanmay@yopmail.com","Message":"Email already exist"} ], "failed_water_meters": [ {"MeterId":"M1001","Message":"Meter ID invalid"} ] }
内容的提问来源于stack exchange,提问作者RANU TANWAR
相关产品推荐
相关产品推荐

