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

