.net core mvc项目中JSON统一处理
需求背景
在.net core mvc 项目中,json设置通过一下方式处理
引用了nuget包:Microsoft.AspNetCore.Mvc.NewtonsoftJson
C# 全选
builder.Services.AddControllers(option =>
{
//option.Filters.Add<DBLoggerProvider>(); // 接口日志
option.Filters.Add<FormatResponseAttribute>(); // 格式化返回结果
//option.Filters.Add<GlobalExceptionFilter>(); // 全局异常处理
}).AddNewtonsoftJson(options =>
{
// https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.extensions.dependencyinjection.mvcnewtonsoftjsonoptionsextensions.usemembercasing?view=aspnetcore-8.0
//options.UseMemberCasing();
options.UseCamelCasing(true); // 属性名使用驼峰命名方式
options.SerializerSettings.Converters.Add(new GZDateTimeConvertor());
options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
});此时,对于其他一些场景中,我们需要手动把对象转换为json字符串,以及json字符串转换为对象
比如,jwttoken验证,以及全局异常获取中间件,都需要直接写context.Response。这时候为了系统统一。我们就需要在序列化的时候,使用相同的json配置才好.
简单粗暴的用 Newtonsoft.Json.JsonConvert.SerializeObject 序列化的json字符串可能和系统默认的不一致
解决方案

JsonHelper类,提供Json序列化和反序列化的方法,有需求时统一调用这个方法
C# 全选
public class JsonHelper
{
internal static JsonSerializerOptions? JsonOptions;
/// <summary>
/// 序列化Json,使用系统默认的JsonOptions
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static string SerializeObject(object obj)
{
return System.Text.Json.JsonSerializer.Serialize(obj, JsonOptions);
}
/// <summary>
/// 序列化Json,不适用系统默认的JsonOptions
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static string SerializeObjectNoOptions(object obj)
{
return System.Text.Json.JsonSerializer.Serialize(obj);
}
/// <summary>
/// 反序列化 Json
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="json"></param>
/// <returns></returns>
public static T? Deserialize<T>(string json)
{
// System.Text.Json.JsonSerializer.Deserialize 默认会区分大小写
// JsonOptions.PropertyNameCaseInsensitive = true;
// return System.Text.Json.JsonSerializer.Deserialize<T>(json, JsonOptions);
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json);
}
} JsonOptionService,定义一个IhostedService,获取系统中的JsonOption。交给JsonHelper使用
C# 全选
public class JsonOptionService : IHostedService
{
private readonly JsonSerializerOptions _jsonOptions;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="options"></param>
public JsonOptionService(IOptions<JsonOptions> options)
{
JsonHelper.JsonOptions = options.Value.JsonSerializerOptions;
}
public Task StartAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}ServiceCollectionExtensions 配置扩展
C# 全选
/// <summary>
/// 扩展
/// </summary>
public static class ServiceCollectionExtensions
{
private static readonly ProxyGenerator _generator = new ProxyGenerator();
public static IServiceCollection UseJsonOptions(this IServiceCollection services)
{
services.AddHostedService<JsonOptionService>();
return services;
}
}
使用,
C# 全选
#region 配置系统默认Json配置
builder.Services.UseJsonOptions();
#endregion
版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
post 张国生


