.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> &" }, options);
执行结果
序列化后的字符串为:
{"text":"abc 'zorro' 123 \u003ctest\u003e \u0026amp;"}
可以看到,单引号未被转义,而<、>、&仍保持默认的转义行为,符合需求。
原理说明
DefaultJavaScriptEncoder默认会转义单引号(')以满足HTML安全要求,即使它属于允许的字符范围。自定义编码器通过重写WillEncode方法,排除单引号的转义判断,让单引号直接输出,同时保留其他字符的默认转义逻辑。
内容的提问来源于stack exchange,提问作者steb
相关产品推荐
相关产品推荐

