【问题标题】:Is there a way to change the property names to snake_case in an ASP.NET Core 3.0 API?有没有办法在 ASP.NET Core 3.0 API 中将属性名称更改为 snake_case?
【发布时间】:2019-11-29 11:40:37
【问题描述】:

我正在尝试在我的 ASP.NET Core 3.0 API 中将所有属性名称全局更改为 snake_case,但我找不到方法。

之前,在 ASP.NET Core 2.2 中,我使用过:

services.AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver() { NamingStrategy = new SnakeCaseNamingStrategy() })

现在在 ASP Net Core 3.0 中,我发现的唯一相似之处是:

services.AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase)

但是 snake_case 不存在。

有没有一种方法可以在我的 ASP.NET Core 3.0 API 中为全局请求和响应对象创建蛇形案例?

【问题讨论】:

    标签: c# rest api asp.net-core-3.0


    【解决方案1】:

    看完https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-2.2&tabs=visual-studio找到解决办法

    新代码是:

    .AddNewtonsoftJson(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver() { NamingStrategy = new SnakeCaseNamingStrategy() })
    

    【讨论】:

    • 虽然上面的代码确实有效,并且会给您提供与之前完全相同的东西,但它也会让您使用 Newtonsoft 而不是 System.Text.Json,后者更快、异步且内置。
    • .NET Core 3.0+ 序列化程序中的 snake_case 支持计划用于 System.Text.Json 5.0:github.com/dotnet/corefx/issues/39564
    【解决方案2】:

    对于 .NET Core 3.0,使用:

     .AddJsonOptions(o => o.JsonSerializerOptions.PropertyNamingPolicy = null)
    

    【讨论】:

    • 这将删除任何命名策略并且不强制执行蛇形大小写。但是,它将允许您传递原始属性名称,因此如果您对属性使用snake_case,它将被正确序列化。因此,这更像是一种解决方法而不是解决方案。
    【解决方案3】:

    snakcase_json repository 的启发,一个简单但可能不是非常有效的解决方案是:

    public class SnakeCasePropertyNamingPolicy : JsonNamingPolicy
    {
        public override string ConvertName(string name)
        {
            return string.Concat(name.Select((character, index) =>
                    index > 0 && char.IsUpper(character)
                        ? "_" + character
                        : character.ToString()))
                .ToLower();
        }
    }
    

    然后在启动时添加以下选项:

    services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy = new SnakeCasePropertyNamingPolicy();
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 2010-10-08
      • 1970-01-01
      • 2013-04-21
      相关资源
      最近更新 更多