ChatGPT解决这个技术问题 Extra ChatGPT

JSON 属性现在在从 ASP .Net Core 1.0.0-rc2-final 交换到 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 Core 控制器开始返回带有小写属性的 JSON?我如何回到他们那里尊重模型中的属性名称的情况?

对于那些正在寻找 .Net Core 3 答案的人,您需要向下滚动到页面底部。

O
Oleksandr Fentsyk

MVC 现在默认使用驼峰式名称序列化 JSON

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

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

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


netcore2:使用 Newtonsoft.Json.Serialization;
我不想更改我的 JSON 序列化的全部,只是需要与某些第三方软件的行为相匹配的一种特殊情况。如何在 Json() 调用的第二个参数中提供正确的序列化设置?
I
Ian Kemp

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

你是我的主和救世主
这对我来说在 Core 3.1 上效果很好。我无法让我的剑道组件正常工作,并发现 json 格式为驼峰式。这解决了这个问题。
我也是你的对象
S
Stephen Kennedy

您可以像这样更改行为:

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

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


U
U.Y.

对于迁移到 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 相同
@MarkSchultheiss您可能是对的,因为我的答案与所有其他答案相似,但是,当我根据我的项目类型(即MVC利用视图)搜索正确答案时,我没有找到与我的项目匹配的确切答案。 AddControllersWithViews() 添加了那些缺失的部分,我认为它对将来的任何人都有用。谢谢你的评论!
R
RouterBox

这将在 dotnet core 3 webapi 中修复它,因此它根本不会更改您的属性名称,并且您会完全按照您的意图返回给您的客户端。

在 Startup.cs 中:

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

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

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

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

A
Abdul Rehman Sayed

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

在您的 WebApiConfig 中添加这一行。

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

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

在此处添加此作为答案,因为这也首先出现在 google 搜索 web api 中。


A
Asiri Jayaweera

对于 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;
    }
});

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅