我刚刚将我们的项目从 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?我如何回到他们那里尊重模型中的属性名称的情况?
MVC 现在默认使用驼峰式名称序列化 JSON
默认情况下使用此代码避免骆驼案例名称
services.AddMvc()
.AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());
来源:https://github.com/aspnet/Announcements/issues/194
如果您从 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 });
您可以像这样更改行为:
services
.AddMvc()
.AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());
在此处查看公告:https://github.com/aspnet/Announcements/issues/194
对于迁移到 Core 3.1 并拥有 Core MVC 项目的用户,可以在 Startup.cs 中使用以下设置代码:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddControllersWithViews().AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);
...
}
这将在 dotnet core 3 webapi 中修复它,因此它根本不会更改您的属性名称,并且您会完全按照您的意图返回给您的客户端。
在 Startup.cs 中:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
services.AddHttpClient();
}
对于不想全局设置它的人,也可以使用 ContractResolver 作为 Json 结果返回:
public IActionResult MyMethod()
{
var obj = new {myValue = 1};
return Json(obj, new JsonSerializerSettings {ContractResolver = new DefaultContractResolver()});
}
对于一些使用 ASP.net WEB API(而不是 ASP.NET Core)的人。
在您的 WebApiConfig 中添加这一行。
//Comment this jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();
在此处添加此作为答案,因为这也首先出现在 google 搜索 web api 中。
对于 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;
}
});
不定期副业成功案例分享
Json()
调用的第二个参数中提供正确的序列化设置?