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

.NET Core中System.Text.Json如何避免序列化时转义单引号?

解决System.Text.Json序列化时仅禁用单引号转义的问题

问题场景

需要在.NET Core的System.Text.Json序列化时,仅让单引号不被转义,但尝试自定义TextEncoderSettings的方式无效:

var encoderSettings = new TextEncoderSettings();
encoderSettings.AllowRange(UnicodeRanges.BasicLatin);
encoderSettings.AllowCharacters('\u0027');

var options = new JsonSerializerOptions{ 
    Encoder = JavaScriptEncoder.Create(encoderSettings) 
};

System.Text.Json.JsonSerializer.Serialize(new { text = "abc 'zorro' 123" }, options);

执行后结果仍为:

{"text":"abc \u0027zorro\u0027 123"}

而期望结果是:

{"text":"abc 'zorro' 123"}

使用UnsafeRelaxedJsonEscaping虽然能实现单引号不转义,但会同时禁用<、>、&等所有非JSON标准要求的转义,不符合需求。

解决方案

通过自定义JavaScriptEncoder派生类,仅取消单引号的转义,同时保留其他默认需要转义的字符(如<、>、&):

步骤1:实现自定义编码器

using System.Text.Encodings.Web;
using System.Text.Unicode;

public class SingleQuoteSafeEncoder : DefaultJavaScriptEncoder
{
    public static new readonly SingleQuoteSafeEncoder Instance = new();

    private SingleQuoteSafeEncoder() : base(UnicodeRanges.All) { }

    protected override bool WillEncode(char c)
    {
        // 仅当字符不是单引号时,使用默认的转义判断逻辑
        return c != '\'' && base.WillEncode(c);
    }
}

步骤2:使用自定义编码器序列化

var options = new JsonSerializerOptions
{
    Encoder = SingleQuoteSafeEncoder.Instance
};

var jsonString = JsonSerializer.Serialize(new { text = "abc 'zorro' 123 <test> &amp;" }, options);

执行结果

序列化后的字符串为:

{"text":"abc 'zorro' 123 \u003ctest\u003e \u0026amp;"}

可以看到,单引号未被转义,而<、>、&仍保持默认的转义行为,符合需求。

原理说明

DefaultJavaScriptEncoder默认会转义单引号(')以满足HTML安全要求,即使它属于允许的字符范围。自定义编码器通过重写WillEncode方法,排除单引号的转义判断,让单引号直接输出,同时保留其他字符的默认转义逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:20:45