C# SSIS脚本组件SQL标签数据转义双引号发送JSON报错如何解决
问题根因
手动拼接JSON字符串无法自动处理特殊字符转义,从数据库取出的tags字段自带双引号、反斜杠等JSON敏感字符,直接拼接会破坏JSON结构,这是400错误的核心原因。
最优解决方案(推荐)
不要手动拼接JSON,使用成熟的JSON序列化库自动处理转义,操作步骤如下:
步骤1:引入JSON序列化库
在SSIS脚本项目中通过NuGet安装Newtonsoft.Json,高版本.NET环境也可以使用内置的System.Text.Json。
步骤2:定义和API结构匹配的C#类
public class Address { public string streetAddress { get; set; } public string zipCode { get; set; } public string city { get; set; } public string country { get; set; } } public class Contact { public string email { get; set; } public string name { get; set; } public string externalId { get; set; } public string company { get; set; } public Address address { get; set; } } public class DictionaryProperty { public string name { get; set; } public string type { get; set; } public string value { get; set; } } public class ApiRequest { public Contact contact { get; set; } public string owner { get; set; } public Dictionary<string, object> properties { get; set; } public string province { get; set; } public List<DictionaryProperty> dictionaryProperties { get; set; } public List<string> tags { get; set; } public string apiKey { get; set; } public string clientId { get; set; } public string sha { get; set; } public long requestTime { get; set; } // async是C#关键字,加@转义 public string @async { get; set; } }
步骤3:处理tags字段并填充请求对象
// 拆分数据库返回的tags字符串为干净的标签列表 var tagList = Row.tags.Split(',') .Select(t => t.Trim().Trim('"')) .ToList(); // 填充请求对象 var apiReq = new ApiRequest { contact = new Contact { email = Row.email, name = Row.name, externalId = Row.exid.ToString(), company = Row.company, address = new Address { streetAddress = Row.strAdd, zipCode = Row.code, city = Row.city, country = Row.country } }, owner = Row.owner, properties = new Dictionary<string, object> { {"someprop", Row.someprop } }, province = Row.province, dictionaryProperties = new List<DictionaryProperty> { new DictionaryProperty { name = "nameOfProp", type = "NUMBER", value = Row.Value } }, tags = tagList, apiKey = "apikey", clientId = "cid", sha = "sha", requestTime = req.time, @async = "true" };
步骤4:序列化得到合法JSON
// Newtonsoft.Json写法 string jsonData = JsonConvert.SerializeObject(apiReq); // System.Text.Json写法 // string jsonData = JsonSerializer.Serialize(apiReq);
序列化库会自动处理所有特殊字符转义,生成完全符合规范的JSON字符串,不会出现格式错误。
临时解决方案(不推荐,仅作兼容用)
如果确实需要手动拼接,需要主动处理tags字段的转义:
// 对每个标签的反斜杠、双引号做JSON转义 var escapedTags = string.Join(",", Row.tags.Split(',') .Select(t => { var cleanTag = t.Trim().Trim('"'); // 转义反斜杠和双引号 cleanTag = cleanTag.Replace("\\", "\\\\").Replace("\"", "\\\""); return $"\"{cleanTag}\""; })); // 拼接时替换tags部分 var data = "{ ... ,\"tags\": [" + escapedTags + "], ... }";
之前方案失效的原因
- 从SQL返回空
[]时,InputBuffer取出的是字符串"[]",直接放到[ ]里会变成[[]],不符合数组格式,所以报错;写死的[]是合法数组结构,所以正常。 - 修改SQL存储的斜杠没有解决双引号转义的核心问题,从数据库取出的双引号不会自动转为JSON需要的
\",直接拼接会打断JSON结构。 - C#字符串前加
@仅处理C#代码层面的字符串转义,和JSON需要的转义规则无关,所以无效。
内容的提问来源于stack exchange,提问作者encoder93x
相关产品推荐
相关产品推荐

