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

相关推荐
矿工学编程2 小时前
.NET Core liunx二进制文件安装
.netcore
小吕学编程4 小时前
Jackson使用详解
java·javascript·数据库·json
专注VB编程开发20年4 小时前
asp.net IHttpHandler 对分块传输编码的支持,IIs web服务器后端技术
服务器·前端·asp.net
双叶8366 小时前
(C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)(网页版预告)(html)(js)(json)
c语言·javascript·数据结构·html·json
电商数据girl1 天前
酒店旅游类数据采集API接口之携程数据获取地方美食品列表 获取地方美餐馆列表 景点评论
java·大数据·开发语言·python·json·旅游
bing_1582 天前
Spring MVC 根据请求头 (如 Accept) 怎么返回 JSON 或 XML 数据?
spring·json·mvc
半路_出家ren2 天前
python处理异常,JSON
python·json·异常处理
傻小胖2 天前
json-server的用法-基于 RESTful API 的本地 mock 服务
后端·json·restful
search72 天前
配置文件介绍xml、json
xml·json
Chandler243 天前
Go语言:json 作用和语法
开发语言·golang·json