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

相关推荐
Lost of 程序猿1 天前
用 YARP 为 .NET 微服务搭一座“立交桥“:路由转发与生产配置实践
c#·asp.net
csdn_aspnet1 天前
.NetCore Webapi 接口验证请求来源
.netcore·ip·token·签名·webapi·cors·sign
Lost of 程序猿1 天前
用 Quartz.NET 优雅地处理 .NET 定时任务:从选型到 Docker 部署全记录
后端·c#·asp.net
天若有情6731 天前
独立开发复盘:我用 Node.js 做了个在线工具箱
前端·json·工具
Asurplus2 天前
【SpringBoot4】3、从SpringBoot4升级Sa-Token1.46.0报错
redis·sa-token·json·jackson·springboot4
代码中介商2 天前
C++ 预约系统实战(三):服务端实现——libevent 事件驱动与业务路由
c++·json·c/s
譕痕3 天前
notepad++安装插件 可视化展示 json串内容
json·intellij-idea
databook3 天前
DuckDB + SQL 高效分析 JSON 数据
数据分析·json·nosql
数据狐(Datafox)4 天前
1688商品列表API接口解析(附 JSON 样例)
java·开发语言·数据库·爬虫·json
宝桥南山4 天前
Microsoft Fabric - 简单尝试一下Microsoft Fabric .NET SDK
microsoft·微软·.net·.netcore·powerbi·fabric