.NET Core 6 Web API如何全局配置Json响应字符串HtmlEncode?
.NET Core 6 Web API 全局配置JSON字符串HTML编码方案
你可以通过自定义JSON转换器+全局注册的方式实现,无需重复编写编码代码,以下是具体实现方案:
方案一:使用System.Text.Json(默认序列化器)
1. 自定义HTML编码字符串转换器
创建继承自JsonConverter<string>的转换器类,在序列化时自动对字符串进行HTML编码:
using System.Text.Json; using System.Text.Json.Serialization; using System.Web; public class HtmlEncodedStringConverter : JsonConverter<string> { // 反序列化时可按需解码,若不需要可直接返回原始值 public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var value = reader.GetString(); return string.IsNullOrEmpty(value) ? value : HttpUtility.HtmlDecode(value); } // 序列化时对字符串进行HTML编码 public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) { var encodedValue = string.IsNullOrEmpty(value) ? value : HttpUtility.HtmlEncode(value); writer.WriteStringValue(encodedValue); } }
2. 在Program.cs全局注册转换器
将自定义转换器添加到JSON序列化配置中,全局生效:
var builder = WebApplication.CreateBuilder(args); // 配置控制器及JSON序列化选项 builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new HtmlEncodedStringConverter()); }); var app = builder.Build(); // 中间件路由配置 app.MapControllers(); app.Run();
方案二:使用Newtonsoft.Json(Json.NET)
如果项目使用Newtonsoft.Json作为序列化器,可按以下方式配置:
1. 自定义HTML编码转换器
using Newtonsoft.Json; using System.Web; public class HtmlEncodedStringConverter : JsonConverter<string> { public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer) { var value = reader.Value as string; return string.IsNullOrEmpty(value) ? value : HttpUtility.HtmlDecode(value); } public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer) { var encodedValue = string.IsNullOrEmpty(value) ? value : HttpUtility.HtmlEncode(value); writer.WriteValue(encodedValue); } }
2. 全局注册转换器
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.Converters.Add(new HtmlEncodedStringConverter()); }); var app = builder.Build(); app.MapControllers(); app.Run();
局部生效(可选)
若不需要全局编码,可仅对特定类或属性启用编码,只需在目标类/属性上添加特性标记:
// 对单个属性生效 public class UserInfo { [JsonConverter(typeof(HtmlEncodedStringConverter))] public string NickName { get; set; } } // 对整个类的所有字符串属性生效 [JsonConverter(typeof(HtmlEncodedStringConverter))] public class Article { public string Title { get; set; } public string Content { get; set; } }
内容的提问来源于stack exchange,提问作者Jeeten Parmar
相关产品推荐
相关产品推荐

