JSON 属性现在在从 ASP .Net Core 1.0.0-rc2-final 到 1.0.0 交换时小写

JSON properties now lower case on swap from ASP .Net Core 1.0.0-rc2-final to 1.0.0

我刚刚将我们的项目从 ASP .Net Core 1.0.0-rc2-final 换成了 1.0.0。由于 JSON 资产资本化,我们的网站和客户端已停止工作。例如,这行 JavaScript 现在失败了

for (var i = 0; i < collection.Items.length; i++){

因为控制器现在调用数组 "items" 而不是 "Items"。除了安装更新的软件包和编辑 project.json 文件外,我没有做任何更改。我没有更改仍然大写其属性的 C# 模型文件。

为什么 ASP.Net 核心控制器开始返回具有小写属性的 JSON?我如何回到他们那里,尊重模型中 属性 个名字的情况?

您可以像这样更改行为:

services
    .AddMvc()
    .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());

在此处查看公告:https://github.com/aspnet/Announcements/issues/194

MVC 现在默认使用驼峰命名法序列化 JSON

默认使用此代码避免驼峰命名

  services.AddMvc()
        .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());

来源: https://github.com/aspnet/Announcements/issues/194

对于一些使用 ASP.net WEB API(而不是 ASP.NET 核心)的人。

在您的 WebApiConfig 中添加这一行。

//Comment this jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

将此添加为此处的答案,因为它在 google 网络搜索 api 中也排在首位。

以防您从 Google 找到此内容并正在寻找 Core 3 的解决方案。

Core 3 使用System.Text.Json,默认情况下不保留大小写。正如此 GitHub issue 中提到的,将 PropertyNamingPolicy 设置为 null 将解决问题。

public void ConfigureServices(IServiceCollection services)
{
...
    services.AddControllers()
            .AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);

如果您不想更改全局设置,只需执行一个操作,就像这样:

return Json(obj, new JsonSerializerOptions { PropertyNamingPolicy = null });

这将在 dotnet core 3 webapi 中修复它,因此它根本不会更改您的 属性 名称,并且您 return 对您的客户来说正是您想要的。

在Startup.cs中:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
        services.AddHttpClient();
    }

对于核心 2.x 版本,使用此代码您可以默认避免驼峰命名。您需要在 Startup.cs 文件的 ConfigureServices 方法中添加以下代码。

services.AddMvc()
.AddJsonOptions(o =>
{
    if (o.SerializerSettings.ContractResolver != null)
    {
        var castedResolver = o.SerializerSettings.ContractResolver
        as DefaultContractResolver;

        castedResolver.NamingStrategy = null;
    }
});

迁移到 Core 3.1 并拥有 Core MVC 项目的用户可以在 Startup.cs 中使用以下设置代码:


        public void ConfigureServices(IServiceCollection services)
        {
            ...
            services.AddControllersWithViews().AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);
            ...
        }

对于不想全局设置它的人,也可以使用 ContractResolver 来 return 作为 Json 结果:

public IActionResult MyMethod()
{
    var obj = new {myValue = 1};
    return Json(obj, new JsonSerializerSettings {ContractResolver = new DefaultContractResolver()});
}