.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字符串可能和系统默认的不一致

解决方案

.net core mvc项目中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开发框架网发布内容,转载请附上原文出处连接
张国生
上一篇:搭配Serilog一起使用的日志搜索分析方案
下一篇:没有了
评论列表

发表评论

评论内容
昵称:
关联文章

.net core mvc项目JSON统一处理
.net core MVC 使用 jquery ajax请求 Post json
ASP.NET Core统一接口返回模型
.NET Core 项目windows server部署
asp.net - 在 ASP.NET Core MVC 嵌套 TagHelper
ASP.NET MVC和ASP.NET Core MVC获取当前URL/Controller/Action
.net core MVC页面源码文件文被编码
ASP.NET Core MVC 在过滤器ActionFilter保存页面的生成的html静态页面文件
.NET Core MVC 实现长时间任务的进度显示
ASP.NET Core MVC的路由约束
.NET Core MVC中间件使用记录日志
.NET Core 项目 DbProviderFactories.GetFactoryClasses()返回空
在 ASP.NET Core ,如何手动序列化 JSON 并保持与系统一致?
asp.net core mvc修改cshtml试图热加载动态更新
.NETCore和.NET5 MVC 控制器判断是否登录
ASP.NET+MVC入门踩坑笔记 (一) 创建项目 项目配置运行 以及简单的Api搭建
asp.net core MVC路由添加.html伪静态url时报错
ASP.NET MVC快速入门(一)
.NET Core ResponseCache 浏览器缓存
.NETCore和.NET5 MVC解析获取appsettings.json数据

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码