.Net Core 3.0中IMvcBuilder AddJsonOptions放在哪里?


119

我刚刚从升级了我的ASP Web API项目。Net core 2.03.0。我在用

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

以前是为了确保序列化JSON的小写字母。

升级到3.0后,出现此错误:

错误CS1061'IMvcBuilder'不包含'AddJsonOptions'的定义,并且找不到可以接受的扩展方法'AddJsonOptions'接受类型为'IMvcBuilder'的第一个参数(是否缺少using指令或程序集引用?)

根据Asp.Net Core 2.2中MvcJsonOptions的AddJsonOptions,Microsoft.AspNetCore.Mvc.Formatters.Json nuget包提供了AddJsonOptions扩展方法。我尝试安装/重新安装此程序,但仍然无法解决该方法。有趣的是,智能感知仅显示Microsoft.AspNetCore.Mvc.Formatters。即使我添加了Json nuget包,当我尝试添加using语句时也使用Xml

有什么想法吗?该文档AddJsonOptions只上升到.NET 2.2所以也许是方法已经在3.0赞成一些其他配置机制的被弃用?

Answers:


203

作为ASP.NET Core 3.0的一部分,该团队默认情况下不再包括Json.NET。您可以在有关对Microsoft.AspNetCore.App进行重大更改公告中了解有关此内容的更多信息。

代替Json.NET,ASP.NET Core 3.0和.NET Core 3.0包括一个不同的JSON API,该API更加注重性能。您可以在有关“ .NET Core 3.0中JSON的未来”公告中了解更多信息。

ASP.NET Core的新模板将不再与Json.NET捆绑在一起,但是您可以轻松地重新配置项目以使用它而不是新的JSON库。这对于与较旧项目的兼容性以及对新库都不应完全替代都非常重要,因此您在此处看不到完整功能集。

为了使用Json.NET重新配置ASP.NET Core 3.0项目,您将需要添加对NuGet的引用Microsoft.AspNetCore.Mvc.NewtonsoftJson,该引用是包含所有必要位的软件包。然后,在Startup的中ConfigureServices,您需要像这样配置MVC:

services.AddControllers()
    .AddNewtonsoftJson();

这将设置MVC控制器并将其配置为使用Json.NET而不是该新API。除了控制器以外,您还可以使用其他MVC重载(例如,具有视图或Razor页面的控制器)。该AddNewtonsoftJson方法有一个重载,允许您像配置AddJsonOptionsASP.NET Core 2.x 一样配置Json.NET选项。

services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ContractResolver = new DefaultContractResolver();
    });

41
对于那些在家中跟随的人...在迁移项目时,您可能需要添加对“ Microsoft.AspNetCore.Mvc.NewtonsoftJson”的nuget引用,以获得“ AddNewtonsoftJson”扩展名。在编写本文时,如果您使用的是Visual Studio Nuget管理器,则需要检查“ include prereleases”。
NeilMacMullen '19

1
请注意,我通常不建议现在使用实际应用程序迁移到ASP.NET Core 3。当然,如果您只是想玩转游戏,但是在最终版本发布之前还有一些动作,因此,如果您想尽早移植到它,则必须牢记这一点。

1
这可能会触发“不允许执行同步操作”,请检查stackoverflow.com/questions/47735133/…了解更多信息
verbedr

8
对我AddNewtonsoftJson来说,即使在引用该Microsoft.AspNetCore.Mvc.NewtonsoftJson参考文献后,也仍然不见了。
赛义德(Saeed Neamati)

2
@avenmore新的序列化器使用一组单独的属性。您可以[JsonIgnore]System.Text.Json.Serialization名称空间使用。

21

这对我有用,同时使用.Net Core 3

services.AddMvc().AddJsonOptions(o =>
{
    o.JsonSerializerOptions.PropertyNamingPolicy = null;
    o.JsonSerializerOptions.DictionaryKeyPolicy = null;
});

我认为这行应该是:o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Grandizer

1
我也是,但事实并非如此。这个答案对我有用。
马丁

2
不需要o.JsonSerializerOptions.DictionaryKeyPolicy = null;o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
Shahar Shokrani

我希望可以使用此答案,但是我的应用程序是使用Newtonsoft属性构建的,新的MS序列化程序会忽略该属性,这意味着我必须继续将Newtonsoft序列化程序与AddNewtonsoftJson一起使用。也许MS可以添加一个尊重Newtonsoft属性的选项,同时仍然获得他们有希望的性能提升。
埃里克

@eric是的,您是对的,但对于大多数情况,Newtonsoft的性能已足够。
Mohammad Olfatmiri

0

这会有所帮助

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

            });

            services.AddDbContext<PaymentDetailContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DevConnection")));
        }
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.