主页 > IT业界  > 

ASP.NETCore3.1修改个别API返回JSON序列化格式

ASP.NETCore3.1修改个别API返回JSON序列化格式

        ASP.NET Core 3.0及之后的版本中,默认的JSON格式化器是基于System.Text.Json的。返回json格式采用camelCase(第一个单词首字母小写,后面单词首字母大写)。如果想改为PascalCase,可以全局设置PropertyNamingPolicy = null即可。

services.AddControllers() .AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null);

或者 使用NewtonsoftJson,并指定序列化设置。

 services.AddControllers() .AddNewtonsoftJson(options => {     options.SerializerSettings.ContractResolver = new DefaultContractResolver(); });

        如果想改变个别接口为PascalCase格式,有以下几种方式 1、增加NewtonsoftJson支持,并配置返回模型属性JsonProperty,指定序列化后属性名。   不推荐,太麻烦。

services.AddControllers().AddNewtonsoftJson(); //action返回的模型  public class Model {     [JsonProperty("Information")]     public string Information { get; set; } }

2、利用ActionFilterAttribute改变行为。

public class CustomActionJsonFormatAttribute : ActionFilterAttribute {     private Type _ContractResolver { get; set; }     public CustomActionJsonFormatAttribute(Type ContractResolver)     {         _ContractResolver = ContractResolver;     }     public override void OnResultExecuting(ResultExecutingContext context)     {         if (context.Result is ObjectResult objectResult)         {              //2.1 设定OutputFormatter   推荐             objectResult.Formatters.Add(new SystemTextJsonOutputFormatter(new JsonSerializerOptions() { }));         //2.2  这种方式也可以,相当于手工转换了一遍。不推荐         //var properties = context.Result.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);         //var t = properties.FirstOrDefault(c => c.Name == "Value").GetValue(context.Result);         //context.Result = new JsonResult(t, new System.Text.Json.JsonSerializerOptions());              //2.3 残暴一点,将结果序列化之后以字符串方式输出也能实现。但是极不推荐,这种返回的不再是json,而是字符串。            // var settings = new JsonSerializerSettings            // {            //     DateFormatString = "yyyy-MM-dd HH:mm:ss", // 自定义日期格式             //    ContractResolver = new DefaultContractResolver() // 使用默认的契约解析器             //};             //var json = JsonConvert.SerializeObject(objectResult.Value, settings);                   //context.HttpContext.Response.WriteAsync(json);                       }         base.OnResultExecuting(context);     }  } //controller中加上对应特性    [CustomActionJsonFormat(typeof(DefaultContractResolver))]     public class FarmerFileController : ControllerBase

3 、采用自定义的MediaType。默认返回json格式,我们自定义一个格式,本质还是json字符串,只不过采用PascalCase。因为http返回的已经不是json格式,不推荐。

//action中增加Produces特性,配置自定义的content type,接口返回的Result可以随便定义一个模型。 [Produces("text/object")]。 [HttpGet("Query2")] public async  Task<Result> Query2(DateTime? dataDate, bool hasPig = false) {} //自定义OutputFormatter     public class ObjectOutputFormatter : TextOutputFormatter     {         public ObjectOutputFormatter()         {             SupportedEncodings.Add(Encoding.UTF8);             SupportedEncodings.Add(Encoding.Unicode);             // 这样 content type 为 "text/object"时,就被会ObjectOutputFormatter 处理             SupportedMediaTypes.Add("text/object");          }         public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)         {             if (context == null)             {                 throw new ArgumentNullException(nameof(context));             }             if (selectedEncoding == null)             {                 throw new ArgumentNullException(nameof(selectedEncoding));             }                          string text = JsonConvert.SerializeObject(context.Object);             var response = context.HttpContext.Response;             await response.WriteAsync(text, selectedEncoding);         }     } //注入 services services.AddControllers(options =>  {      options.OutputFormatters.Add(new ObjectOutputFormatter());  })

4、修改action返回结果,直接返回自定义序列化配置的JsonResult。这种方式要求修改action返回结果,不太推荐

public async Task< IActionResult> Query3(DateTime? dataDate, bool hasPig = false) {     var result = new Result()     {              };      return new JsonResult(result, new Newtonsoft.Json.JsonSerializerSettings     {         Formatting = Formatting.Indented,     }); } //增加NewtonsoftJson支持   services.AddControllers().AddNewtonsoftJson() ;

参考文章 blogs /cool-net/p/16176643.html blogs /wucy/p/18025196/aspnetcore_webapi_formatter  blogs /qianxingmu/p/13963720.html

标签:

ASP.NETCore3.1修改个别API返回JSON序列化格式由讯客互联IT业界栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“ASP.NETCore3.1修改个别API返回JSON序列化格式