C#中如何让JsonConvert.SerializeObject转义单引号适配localStorage?
解决JsonConvert序列化时自动转义单引号以适配localStorage存储的问题
你的问题根源在于JSON规范本身不需要转义单引号(JSON用双引号作为字符串边界,单引号是普通字符),但当你把序列化后的JSON字符串用单引号包裹作为JavaScript字符串时,内部的单引号会破坏JS的字符串边界,导致语法错误。下面提供几种可靠的解决方法:
方法一:使用JsonConvert的StringEscapeHandling配置
Newtonsoft.Json提供了StringEscapeHandling.EscapeJavaScript选项,专门用于生成适配JavaScript的字符串,它会自动转义单引号、反斜杠等JS敏感字符。修改你的序列化代码如下:
public class Automobile { public string vehicleTrim { get; set; } } var test = new Automobile() { vehicleTrim = "designer's package" }; var serialized = JsonConvert.SerializeObject(test, new JsonSerializerSettings { StringEscapeHandling = StringEscapeHandling.EscapeJavaScript, Formatting = Formatting.None }); // 此时序列化输出:{"vehicleTrim":"designer\'s package"}
这样生成的字符串直接拼入JS代码后,单引号已经被转义,不会再触发语法错误。
方法二:手动替换单引号(简单直接)
如果不想修改全局序列化配置,可以在序列化完成后手动替换字符串中的单引号:
var serialized = JsonConvert.SerializeObject(test, Formatting.None); // 替换单引号为转义后的单引号 serialized = serialized.Replace("'", "\\'");
这种方式轻量,适合只在特定场景需要转义的情况。
方法三:避免字符串拼接(更安全的写法)
其实还有一种更安全的思路:不要用单引号包裹JSON字符串,而是直接将JSON作为JavaScript对象传入,再通过JSON.stringify转换为字符串存入localStorage。这样完全不需要处理单引号转义问题:
var serialized = JsonConvert.SerializeObject(test, Formatting.None); var jsSetScript = $"window.localStorage.setItem('automobile', JSON.stringify({serialized}));"; await Control.EvaluateJavascriptAsync(jsSetScript);
因为serialized本身就是合法的JSON,在JS中会被解析为对象,再通过JSON.stringify转换为标准字符串存入localStorage,彻底规避了单引号冲突的问题。
内容的提问来源于stack exchange,提问作者Vibol
相关产品推荐
相关产品推荐

