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


90

我刚刚将项目从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?我该如何回到他们那里来纪念模型中属性名称的大小写?



2
对于那些寻求.Net Core 3答案的用户,您需要向下滚动到页面底部。
迈克·德文尼

Answers:


157

MVC现在默认情况下使用驼峰式案例名称序列化JSON

使用此代码默认情况下避免使用驼峰式案例名称

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

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


8
netcore2:使用Newtonsoft.Json.Serialization;
david.barkhuizen

3
我不想更改我所有的JSON序列化,只是一种需要匹配某些第三方软件行为的特殊情况。如何在Json()调用的第二个参数中提供正确的序列化设置?
Auspex

79

如果您是从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 });

8
你是我的主和救世主
琼蒂·莫里斯

1
在Core 3.1上,这对我来说效果很好。我无法使我的kendo组件正常工作,并发现json是驼峰格式的。这解决了问题。
Waragi

我也是你的主题
若昂·洛雷罗


9

对于那些迁移到Core 3.1并拥有Core MVC项目的用户,可以在Startup.cs中使用以下安装代码:


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

这与先前的答案相同stackoverflow.com/a/58187836/125981
Mark Schultheiss

@MarkSchultheiss您可能是对的,因为我的答案与其他所有答案都相似,但是,当我根据项目类型(即使用视图的MVC)搜索适当的答案时,我没有找到与我的项目匹配的确切答案。AddControllersWithViews()添加了那些缺失的部分,我认为这对将来的任何人都会有用。不过谢谢您的评论!
UY

3

这将在dotnet core 3 webapi中对其进行修复,以便它根本不会更改您的属性名称,并且您将完全按照预期返回给客户端。

在Startup.cs中:

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


1

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

在您的WebApiConfig中添加此行。

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

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

在这里添加答案作为答案,因为这首先出现在Google搜索Web API中。


0

对于Core 2.x版本,使用此代码可以默认避免使用驼峰式案例名称。您需要在Startup.cs文件的ConfigureServices方法内添加以下代码。

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

        castedResolver.NamingStrategy = null;
    }
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.