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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:20:24