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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:24:06