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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 23:32:18