ASP.NET Core 3.1 修改个别API返回JSON序列化格式

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

cs 复制代码
services.AddControllers()
.AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null);

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

cs 复制代码
 services.AddControllers()
.AddNewtonsoftJson(options =>
{
    options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});

如果想改变个别接口为PascalCase格式,有以下几种方式

1、增加NewtonsoftJson支持,并配置返回模型属性JsonProperty,指定序列化后属性名。 不推荐,太麻烦。

cs 复制代码
services.AddControllers().AddNewtonsoftJson();

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

2、利用ActionFilterAttribute改变行为。

cs 复制代码
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格式,不推荐。

cs 复制代码
//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返回结果,不太推荐

cs 复制代码
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() ;

参考文章

https://www.cnblogs.com/cool-net/p/16176643.html

https://www.cnblogs.com/wucy/p/18025196/aspnetcore_webapi_formatter

https://www.cnblogs.com/qianxingmu/p/13963720.html

相关推荐
deriva3 小时前
.netcore+ef+redis+rabbitmq+dotcap先同步后异步再同步的方法,亲测有效
redis·rabbitmq·.netcore
火车叨位去19499 小时前
Java中的JSON序列化和反序列化
json
测试杂货铺19 小时前
Jmeter(六):json断言元件,jmeter参数化实现
jmeter·json
专注VB编程开发20年20 小时前
开机自动后台运行,在Windows服务中托管ASP.NET Core
windows·后端·asp.net
专注VB编程开发20年1 天前
C#,VB.NET从JSON数据里提取数组中的对象节点值
c#·json·.net
圆滚滚肉肉1 天前
后端MVC(控制器与动作方法的关系)
后端·c#·asp.net·mvc
草履虫建模1 天前
Postman - API 调试与开发工具 - 标准使用流程
java·测试工具·spring·json·测试用例·postman·集成学习
冰茶_11 天前
ASP.NET Core API文档与测试实战指南
后端·学习·http·ui·c#·asp.net
奔跑的蜗牛AZ11 天前
TiDB 字符串行转列与 JSON 数据查询优化知识笔记
笔记·json·tidb
专注VB编程开发20年11 天前
asp.net core Razor动态语言编程代替asp.net .aspx更高级吗?
开发语言·后端·c#·asp.net·.net