C# 如何将字符串列表转换为Object 解决SendGrid API类型错误
错误原因
你的代码存在两个核心问题:
- 多余的序列化操作:你将已经拼接为键值对格式的
flattenList再次传入JsonConvert.SerializeObject,导致整个键值对字符串被转义、外层额外套了一层双引号,原本的多个键值对变成了一个单一字符串值。 - 最终拼接的JSON格式非法:你直接将序列化后的字符串拼入
{},得到的内容不符合JSON对象的键:值结构要求,反序列化后得到的本质是一个字符串类型的值,不是结构化对象,所以SendGrid API识别失败。
修复方案
快速修复(基于你现有逻辑调整)
去掉多余的序列化步骤,直接拼接合法JSON:
// 拼接所有键值对字符串 var flattenList = string.Join(",", jsonVars); // 直接拼为合法JSON对象结构 var validJson = $"{{{flattenList}}}"; // 反序列化得到结构化对象 var emailData = JsonConvert.DeserializeObject<object>(validJson);
更稳定的规范实现(推荐)
避免手动拼接JSON容易出现的转义、格式错误,先将字符串列表转换为字典再生成对象:
using System.Collections.Generic; using Newtonsoft.Json.Linq; // 遍历字符串列表拆分键值存入字典 var dataDict = new Dictionary<string, string>(); foreach (var keyValueStr in jsonVars) { // 按第一个冒号拆分,避免值本身包含冒号导致拆分错误 var splitParts = keyValueStr.Trim('"').Split(new[] { ':' }, 2); var key = splitParts[0].Trim('"'); var value = splitParts[1].Trim('"'); dataDict.Add(key, value); } // 直接生成JObject对象,完全符合SendGrid API的参数类型要求 var emailData = JObject.FromObject(dataDict);
验证方式
修复后可通过以下代码确认类型是否正确:
// 正常应该输出 Newtonsoft.Json.Linq.JObject,而非System.String Console.WriteLine(emailData.GetType().FullName);
内容的提问来源于stack exchange,提问作者JianYA
相关产品推荐
相关产品推荐

