从ASP .Net Core 1.0.0-rc2-final升级到1.0.0后,JSON属性现在变成小写了

136

我刚刚将我们的项目从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 Core控制器开始返回小写属性的JSON?如何让它们恢复到从模型中保留属性名称大小写的状态?


请见 https://github.com/aspnet/Announcements/issues/194 - Joe Audette
4
对于那些寻找 .Net Core 3 答案的人,你需要滚动到页面底部。 - Mike Devenney
13个回答

190

假设您是从Google搜索并寻找Core 3的解决方案。

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

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

如果您不想改变全局设置,仅针对一个操作的话,步骤如下:

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

21
你是我的主宰和救世主。 - Jonty Morris
1
这在Core 3.1上对我很有效。我无法使我的kendo组件正常工作,并发现json是驼峰格式化的。这解决了问题。 - jon.r
我也是你的主题。 - João Loureiro

181

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

使用此代码可以避免默认情况下使用驼峰命名法

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

Source: https://github.com/aspnet/Announcements/issues/194


10
NetCore2:使用Newtonsoft.Json.Serialization; - david.barkhuizen
7
我不想改变我所有的JSON序列化,只需要针对一个特定情况进行更改以匹配第三方软件的行为。如何在Json()调用的第二个参数中提供正确的序列化设置? - Auspex

19

19

对于那些迁移到Core 3.1且拥有Core MVC项目的人,可以在Startup.cs中使用以下设置代码:


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

1
这与之前的答案stackoverflow.com/a/58187836/125981相同。 - Mark Schultheiss
1
@MarkSchultheiss 你可能是对的,因为我的答案与所有其他答案类似,但是当我根据我的项目类型搜索正确的答案时,即使用视图的MVC,我没有找到完全匹配我的项目的确切答案。 AddControllersWithViews() 添加了这些缺失的部分,我认为它将对未来的任何人都有用。不过还是谢谢你的评论! - U.Y.

7
在dotnet core 3 webapi中,您可以进行以下修复,以便完全不更改属性名称,并确保向客户端返回所需内容。
在Startup.cs文件中:
public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
        services.AddHttpClient();
    }

1
这与之前的答案相同 https://dev59.com/ploT5IYBdhLWcg3wvRpk#58187836 - Mark Schultheiss

5
对于不希望将其设置为全局的人,也可以使用ContractResolver将其作为Json结果返回。
public IActionResult MyMethod()
{
    var obj = new {myValue = 1};
    return Json(obj, new JsonSerializerSettings {ContractResolver = new DefaultContractResolver()});
}

3
在 ASP MVC Core 6 Web API 中,将以下代码添加到 Program.cs 文件中可以确保 Swagger UI 上的 JSON 属性名称与 C# 模型属性名称以正确的大小写匹配。无需第三方包。
using Microsoft.AspNetCore.Mvc; 


builder.Services.Configure<JsonOptions>(options =>
{
    options.JsonSerializerOptions.PropertyNamingPolicy = null;
});

1
这个解决方案对于 .Net Core 7 也起作用。非常感谢。 - aurel-LX

1

对于使用 ASP.net WEB API(而不是 ASP.NET Core)的用户。

请在您的 WebApiConfig 中添加以下行。

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

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

我在这里作为答案添加,因为这是谷歌搜索中Web API相关的最先显示出来的。


1

安装

Microsoft.AspNetCore.Mvc.NewtonsoftJson

对于 .NET 6,您应该选择这个版本:6.0.13

然后进入 Program.cs 并进行以下配置

builder.Services
.AddControllersWithViews()
.AddNewtonsoftJson(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());

这个答案对我帮助很大。 - 彭彥雄

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接