ChatGPT解决这个技术问题 Extra ChatGPT

.Net Core 3.0 中的 IMvcBuilder AddJsonOptions 去了哪里?

我刚刚将我的 ASP Web API 项目从 .Net core 2.0 升级到 3.0。我正在使用

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

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

升级到 3.0 后出现此错误:

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

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

有什么想法吗? AddJsonOptionsdocumentation 仅上升到 .Net 2.2,所以也许该方法在 3.0 中已被弃用,而转而支持其他一些配置机制?


p
poke

作为 ASP.NET Core 3.0 的一部分,团队默认不再包含 Json.NET。您可以在 announcement on breaking changes to Microsoft.AspNetCore.App 中大致了解更多相关信息。

与 Json.NET 不同,ASP.NET Core 3.0 和 .NET Core 3.0 包含不同的 JSON API,它更注重性能。您可以在 announcement about “The future of JSON in .NET Core 3.0” 中了解更多信息。

ASP.NET Core 的新模板将不再与 Json.NET 捆绑,但您可以轻松地重新配置项目以使用它而不是新的 JSON 库。这对于与旧项目的兼容性都很重要,也因为新库不应该完全替代,所以你不会在那里看到完整的功能集。

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

services.AddControllers()
    .AddNewtonsoftJson();

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

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

对于那些在家里跟随的人......迁移项目时,您可能需要添加对“Microsoft.AspNetCore.Mvc.NewtonsoftJson”的nuget引用以获得“AddNewtonsoftJson”扩展。在撰写本文时,如果您使用的是 Visual Studio Nuget 管理器,则需要检查“包括预发布”。
请注意,我通常不建议使用实际应用程序迁移到 ASP.NET Core 3。如果您只是想玩玩,当然可以,但是在最终版本之前仍有一些变化,因此如果您想尽早迁移到它,则必须牢记这一点。
对我来说,AddNewtonsoftJson 丢失了,即使在引用了那个 Microsoft.AspNetCore.Mvc.NewtonsoftJson 引用之后也是如此。
@avenmore 新的序列化程序使用一组单独的属性。您可以使用 System.Text.Json.Serialization 命名空间中的 [JsonIgnore]
@Louis 如果您使用的是 ASP.NET Core 3.1,则需要添加该包的版本 3.1.x。如果您使用的是 ASP.NET Core 3.0(不再受支持),则需要添加该软件包的版本 3.0.x
N
Nicke Manarin

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

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

我假设该行应该是:o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
是的,我也是,但事实并非如此。这个答案对我有用。
不需要 o.JsonSerializerOptions.DictionaryKeyPolicy = null;o.JsonSerializerOptions.PropertyNameCaseInsensitive = false;
我希望我可以使用这个答案,但是我的应用程序是使用 Newtonsoft 属性构建的,新的 MS 序列化程序会忽略这些属性,这意味着我必须继续使用带有 AddNewtonsoftJson 的 Newtonsoft 序列化程序。也许 MS 可以添加一个选项来尊重 Newtonsoft 属性,同时仍然获得他们所承诺的性能提升。
@eric 是的,你是对的,但是 Newtonsoft 的性能足以应付大多数情况。
D
Drilon Ahmetaj

确保您安装了 Microsoft.AspNetCore.Mvc.NewtonsoftJson 包。

https://i.stack.imgur.com/ZW3LF.png


J
Joey

这会有所帮助

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")));
        }

A
Adil Bhatti

这将有助于尝试安装 Nuget 包

Microsoft.AspNetCore.Mvc.NewtonsoftJson


S
SAM

这对我有用,从适用于 ASP.NET Core 3.0 的 NuGet“dotnet add package Microsoft.AspNetCore.Mvc.NewtonsoftJson --version 3.1.0”版本 3.1.0 安装 NewtonsoftJson 包并使用以下代码-

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
    .AddNewtonsoftJson(opt => {
        opt.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
    });

希望它工作正常,谢谢。


J
Justus kasyoki

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


您的答案可以通过额外的支持信息得到改进。请edit添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以找到有关如何写出好答案的更多信息in the help center
这并没有真正回答这个问题。如果您有其他问题,可以点击 Ask Question 提出问题。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以通过add a bounty来引起对这个问题的更多关注。 - From Review