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
相关产品推荐
相关产品推荐

