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

相关推荐
一枚小小程序员哈12 小时前
基于微信小程序的家教服务平台的设计与实现/基于asp.net/c#的家教服务平台/基于asp.net/c#的家教管理系统
后端·c#·asp.net
做一位快乐的码农1 天前
基于.net、C#、asp.net、vs的保护大自然网站的设计与实现
c#·asp.net·.net
陈涛5752 天前
5个最好用的 JSON 工具推荐:让数据处理变得简单高效
json
bkspiderx2 天前
pb2json.hpp 文档:Protobuf 与 JSON 通用转换工具类
json·protobuf·protobuf与json转换
万粉变现经纪人3 天前
何解决PyCharm中pip install安装Python报错ModuleNotFoundError: No module named ‘json’问题
python·pycharm·json·beautifulsoup·scikit-learn·matplotlib·pip
一枚小小程序员哈4 天前
基于C#、.net、asp.net的心理健康咨询系统设计与实现/心理辅导系统设计与实现
c#·asp.net·.net
晨欣4 天前
orjson 与 json:实战对比与选型指南(含示例)(GPT-5 回答)
gpt·json
Archy_Wang_14 天前
ASP.NET 上传文件安全检测方案
后端·c#·asp.net
时光追逐者4 天前
C#/.NET/.NET Core技术前沿周刊 | 第 49 期(2025年8.1-8.10)
c#·.net·.netcore
Pi_Qiu_4 天前
Python初学者笔记第二十二期 -- (JSON数据解析)
笔记·python·json