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

C#序列化字典列表时单引号转'的解决方法

解决JavaScriptSerializer序列化时单引号被转义为'的问题

嘿,这个问题我之前也碰到过!原因是JavaScriptSerializer默认会自动编码HTML特殊字符,单引号刚好在被编码的名单里,所以才变成了'。给你几个实用的解决办法:

方法一:手动替换编码后的单引号

最简单直接的路子,序列化完成后把转义后的'替换回单引号就行:

JavaScriptSerializer javascriptSerializer = new JavaScriptSerializer();
string serializedArticles = javascriptSerializer.Serialize(list);
// 把编码的单引号替换回去
serializedArticles = serializedArticles.Replace("'", "'");
body.Add("Rows", serializedArticles);

这种方式快准狠,适合你确定只需要处理单引号、场景简单的情况。

方法二:自定义转换器控制序列化逻辑

如果不想手动替换,可以写个自定义的JavaScriptConverter,自己说了算序列化时怎么处理字符:

public class NoHtmlEncodeConverter : JavaScriptConverter
{
    public override IEnumerable<Type> SupportedTypes
    {
        get { return new List<Type> { typeof(Dictionary<string, string>), typeof(List<Dictionary<string, string>>) }; }
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        var list = obj as List<Dictionary<string, string>>;
        if (list != null)
        {
            var serializedItems = new List<IDictionary<string, object>>();
            foreach (var dict in list)
            {
                var itemDict = new Dictionary<string, object>();
                foreach (var kvp in dict)
                {
                    // 直接保留原始字符串,不做HTML编码
                    itemDict[kvp.Key] = kvp.Value;
                }
                serializedItems.Add(itemDict);
            }
            // 这里返回列表的序列化结构,你可以根据实际需求调整
            return new Dictionary<string, object> { ["Items"] = serializedItems };
        }

        // 处理单个字典的情况(如果需要的话)
        var singleDict = obj as Dictionary<string, string>;
        if (singleDict != null)
        {
            var result = new Dictionary<string, object>();
            foreach (var kvp in singleDict)
            {
                result[kvp.Key] = kvp.Value;
            }
            return result;
        }

        return new Dictionary<string, object>();
    }

    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        // 如果你不需要反序列化功能,这里返回null就行;需要的话再实现对应逻辑
        return null;
    }
}

使用的时候别忘了注册这个转换器:

JavaScriptSerializer javascriptSerializer = new JavaScriptSerializer();
javascriptSerializer.RegisterConverters(new List<JavaScriptConverter> { new NoHtmlEncodeConverter() });
string serializedArticles = javascriptSerializer.Serialize(list);
body.Add("Rows", serializedArticles);

这种方式更灵活,适合你需要控制多个特殊字符编码逻辑的场景。

方法三:改用Newtonsoft.Json(Json.NET)

如果你的项目允许引入第三方库,我强烈推荐用Newtonsoft.Json(也就是Json.NET),它默认不会对单引号做HTML编码,用起来还特别简单:
先通过NuGet安装Newtonsoft.Json包,然后替换你的序列化代码:

string serializedArticles = JsonConvert.SerializeObject(list);
body.Add("Rows", serializedArticles);

这绝对是最省心的方案,Json.NET的序列化逻辑更贴合标准JSON的预期,而且功能比JavaScriptSerializer强大太多,后续扩展也方便。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:52:36