.Net Core 3.0 中的 IMvcBuilder AddJsonOptions 去了哪里?
Posted
技术标签:
【中文标题】.Net Core 3.0 中的 IMvcBuilder AddJsonOptions 去了哪里?【英文标题】:Where did IMvcBuilder AddJsonOptions go in .Net Core 3.0? 【发布时间】:2019-09-04 02:47:00 【问题描述】:我刚刚将我的 ASP Web API 项目从 .Net core 2.0
升级到 3.0
。我正在使用
services.AddMvc()
.AddJsonOptions(options =>options.SerializerSettings.ContractResolver
= new DefaultContractResolver());
以前是为了确保序列化 JSON 的小写。
升级到 3.0 后出现此错误:
错误 CS1061 'IMvcBuilder' 不包含 'AddJsonOptions' 并且没有可访问的扩展方法 'AddJsonOptions' 可以找到接受“IMvcBuilder”类型的第一个参数(是 您缺少 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。
有什么想法吗? AddJsonOptions 的 documentation 仅适用于 .Net 2.2,因此该方法在 3.0 中可能已被弃用,而转而采用其他一些配置机制?
【问题讨论】:
【参考方案1】:作为 ASP.NET Core 3.0 的一部分,团队不再默认包含 Json.NET。您可以在announcement on breaking changes to Microsoft.AspNetCore.App 中了解更多相关信息。
ASP.NET Core 3.0 和 .NET Core 3.0 包含不同的 JSON API,而不是 Json.NET,它更注重性能。您可以在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
。【参考方案2】:
这对我有用,同时使用 .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 的性能足以应付大多数情况。【参考方案3】:
确保您安装了 Microsoft.AspNetCore.Mvc.NewtonsoftJson 包。
【讨论】:
【参考方案4】:这会有所帮助
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")));
【讨论】:
【参考方案5】:这将有助于尝试安装 Nuget 包
Microsoft.AspNetCore.Mvc.NewtonsoftJson
【讨论】:
【参考方案6】:这对我有用,从 NuGet "dotnet add package Microsoft.AspNetCore.Mvc.NewtonsoftJson --version 3.1.0" 版本 3.1.0 安装适用于 ASP.NET Core 3.0 的 NewtonsoftJson 包并使用以下代码-
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
.AddNewtonsoftJson(opt =>
opt.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
);
希望一切正常,谢谢。
【讨论】:
以上是关于.Net Core 3.0 中的 IMvcBuilder AddJsonOptions 去了哪里?的主要内容,如果未能解决你的问题,请参考以下文章