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

C#实现不同结构JSON字段映射转换适配Zoho API请求格式

C# 实现业务JSON到Zoho API格式的转换方案

你已经定义好了两端的实体类,不需要做动态字段遍历,直接写显式映射逻辑是最稳妥的方案,性能更好、调试方便,后续字段调整直接改对应映射关系即可,维护成本远低于反射/动态解析方案。

实现步骤

1. 反序列化源JSON

用Json.NET(.NET 6+也可使用内置System.Text.Json,逻辑一致)先将业务层传入的JSON字符串反序列化为你定义的TonerRequestMaster实体:

// 替换为实际获取业务层传入JSON的逻辑
string sourceInputJson = GetBusinessLayerJson();
TonerRequestMaster sourceData = JsonConvert.DeserializeObject<TonerRequestMaster>(sourceInputJson);

2. 编写映射逻辑构造Zoho请求实体

固定配置项(Layout信息、默认负责人、默认状态/优先级这类不变的值)建议抽成配置项或者常量存储,不要硬编码在业务逻辑里;子表明细通过循环遍历完成映射,注意值类型的格式转换。
核心映射代码参考:

TonerRequestZoho zohoRequest = new TonerRequestZoho
{
    data = new List<Datum>()
};

Datum mainRecord = new Datum
{
    // 固定配置项,建议从配置文件读取
    Layout = new Layout { name = "Toner", id = "207069000003373769" },
    Owner = new Owner { id = "207069000001122001" },
    Status = "NEW",
    Priority = "Medium",
    // 注意时区匹配Zoho要求,示例为东5.5区格式,按实际业务场景调整
    Requested_Date_Time = DateTime.UtcNow.AddHours(5).AddMinutes(30),

    // 主表字段映射,按你准备的映射表调整对应关系即可
    Asset = new Asset { id = sourceData.AssetId ?? throw new ArgumentException("缺少资产关联ID") },
    Account_Name = new AccountName { id = sourceData.CRMAccountId ?? throw new ArgumentException("缺少客户关联ID") },
    Related_To = new RelatedTo { id = sourceData.CRMODId ?? "" },
    Contact = new Contact { id = sourceData.CreatedBy ?? "" },
    Current_Black_and_white_Count = sourceData.PrevBWCount.ToString(),
    Current_Color_Count = sourceData.PrevColorCount.ToString(),
    // 主题按业务规则生成,示例取设备序列号拼接
    Subject = $"Toner Request - {sourceData.Serial.Trim()}",
    Solution = sourceData.Remarks,
    Last_Spare_Request_Date = sourceData.ModifiedDateTime?.ToString("yyyy-MM-dd") ?? "",

    // 子表明细映射
    Toner_Request_Details = sourceData.lsttonerRequestDetails.Select(item => new TonerRequestDetail
    {
        Current_Stock1 = item.CurrStockQty,
        Quantity_Req = item.RequiredQty,
        Description = $"Toner Item: {item.ItemCode.TrimEnd('.0')}",
        Item_Code1 = new ItemCode1 { id = item.CRMProductID ?? throw new ArgumentException($"物料{item.ItemCode}缺少Zoho产品ID") }
    }).ToList()
};

// 其余未列出的字段,对照你准备的字段映射表逐一赋值即可
zohoRequest.data.Add(mainRecord);

3. 序列化为符合Zoho要求的JSON

序列化时配置忽略null值、指定日期格式,避免格式不符合API要求:

JsonSerializerSettings serializeSettings = new JsonSerializerSettings
{
    NullValueHandling = NullValueHandling.Ignore,
    DateFormatString = "yyyy-MM-ddTHH:mm:sszzz",
    Formatting = Formatting.Indented
};
string finalZohoRequestJson = JsonConvert.SerializeObject(zohoRequest, serializeSettings);

注意事项

  • 你当前提供的源示例数据里CRMAccountId、CRMProductID、AssetId这类Zoho关联ID都是null,实际调用前需要先根据业务编码(CustAccountId、ItemCode、SerialId等)查询Zoho侧对应的记录ID补全,否则API会返回关联ID无效的错误。
  • 不要图省事写通用反射映射逻辑,第三方API对接场景下字段规则调整频繁,显式赋值的代码排查问题最快,改造成本最低。
  • 序列化前增加必填字段校验,比如Subject、Layout ID、状态这类必填项为空时直接在本地抛出错误,不要把无效请求发到Zoho端再处理异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:36:17