ASP.NET Core 2.0 WebAPI接口JSON将&转义为&的实现方法
解决ASP.NET Core 2.0 WebAPI中JSON转义&为\u0026的问题
我刚好碰到过类似的需求,给你梳理下解决方案:
在ASP.NET Core 2.0里,WebAPI默认用Newtonsoft.Json(也就是Json.NET)做序列化。你现在看到&被转成&,是因为框架默认开启了HTML字符编码(对应StringEscapeHandling.EscapeHtml),而你要的是把&转成JSON的Unicode转义序列\u0026,这个没法直接通过单一配置项实现,但我们可以结合配置调整和自定义转换器来搞定。
第一步:关闭默认的HTML编码
首先得先关掉默认的HTML转义,不然就算加了自定义逻辑,还是会先把&转成&。在你现有的AddJsonOptions配置里,加上这一行:
options.SerializerSettings.StringEscapeHandling = StringEscapeHandling.Default;
这个设置会让Json.NET只转义JSON语法必需的字符(比如引号、反斜杠),不再处理HTML敏感字符。
第二步:添加自定义转换器处理&的Unicode转义
接下来我们需要一个自定义的Json转换器,专门把字符串里的&替换成\u0026。先写这个转换器类:
public class AmpersandEscapeConverter : JsonConverter<string> { // 反序列化时把\u0026还原回& public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer) { return existingValue?.Replace("\\u0026", "&"); } // 序列化时把&转成\u0026 public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer) { if (value == null) { writer.WriteNull(); return; } var escapedValue = value.Replace("&", "\\u0026"); writer.WriteValue(escapedValue); } }
然后把这个转换器加到你的Json配置里,完整的配置代码如下:
services.AddMvc() .AddXmlSerializerFormatters() .AddJsonOptions(options => { // 关闭HTML编码 options.SerializerSettings.StringEscapeHandling = StringEscapeHandling.Default; // 添加自定义转换器 options.SerializerSettings.Converters.Add(new AmpersandEscapeConverter()); // 保留你原来的NullValueHandling配置,比如: // options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; });
如果你只需要处理特定字段
要是你不需要全局所有字符串都处理&,只想针对某个模型属性,那可以不用全局加转换器,直接在属性上标记特性就行:
public class YourApiResponse { [JsonConverter(typeof(AmpersandEscapeConverter))] public string Status { get; set; } // 其他属性... }
记得同样要关闭全局的HTML编码配置哦。
补充说明
默认的EscapeHtml设置是为了防止XSS攻击,所以会把<、>、&这些HTML敏感字符转成实体。但如果你的客户端要求必须用Unicode转义而不是HTML实体,那上面的方案就完全适用。
内容的提问来源于stack exchange,提问作者John81
相关产品推荐
相关产品推荐

