如何在 Asp.net Core Web Api 中默认使用 Newtonsoft.Json?

Posted

技术标签:

【中文标题】如何在 Asp.net Core Web Api 中默认使用 Newtonsoft.Json?【英文标题】:How to use Newtonsoft.Json as default in Asp.net Core Web Api? 【发布时间】:2017-07-06 13:25:44 【问题描述】:

我是 ASP.Net Web Api Core 的新手。在过去的几年里,我一直在使用 ASP.Net MVC,我总是写一个ActionFilter 并使用JSON.NetSerializing 数据转换为JSON。所以,通过这种方式,我用JSON.Net 替换了微软的javascript Serializer(比JSON.Net 慢)(据称它快了400%)。

如何在 ASP.Net Web Api Core 中完成这一切?在哪里更改默认格式化程序

注意:如果您有任何问题,请随时提出。

谢谢

【问题讨论】:

【参考方案1】:

在 .NET Core 3.0+ 中包含 NuGet 包 Microsoft.AspNetCore.Mvc.NewtonsoftJson 然后替换

services.AddControllers();

ConfigureServices

services.AddControllers().AddNewtonsoftJson();

这是 .NET Core 3.0 中的预发布 NuGet 包,但 .NET Core 3.1 中的完整发布包。

我自己也遇到过这个问题,但我发现this SO question and answer 中有相同的答案和一些附加信息。

编辑: 作为一个有用的更新:调用AddNewtonsoftJson() 的代码即使不安装Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet 包也将编译和运行。如果您这样做,它会在安装 both 转换器的情况下运行,但默认为您可能不想要的 System.Text.Json 转换器,因为您正在阅读此答案。因此,您必须记住安装 NuGet 包才能使其正常工作(并且如果您清除并重做 NuGet 依赖项,请记住重新安装它)。 p>

【讨论】:

【参考方案2】:

ASP.NET Core 已经使用 JSON.NET,因为 JavaScriptSerializer 没有实现/移植到 .NET Core。

Microsoft.AspNetCore.Mvc 依赖于Microsoft.AspNetCore.Formatter.Json,而Microsoft.AspNetCore.JsonPatch 又依赖于Newtonsoft.Json(参见source)。

更新

这仅适用于 ASP.NET Core 1.0 到 2.2。 ASP.NET Core 3.0 移除了对 JSON.NET 的依赖,使用了自己的 JSON 序列化器。

【讨论】:

你好曾。感谢您抽出时间和帮助。我已经在 project.json 中注释掉了 newtonsoft 的依赖,但是 web api 还在工作,这是怎么回事? 它已经告诉你了。您正在引用一个(可能是“Microsoft.AspNetCore.Mvc”),它引用了 Formatter.Json,它依赖于 JsonPatch,而 JsonPatch 最终引入了 Newtonsoft.Json。除非您删除所有与 Mvc 相关的包,否则您无法“注释掉” JSON.NET 依赖项,但随后您将获得一个控制台应用程序 所以基本上,即使我删除了引用,它仍然会加载它,因为 JSON.Net 是 JsonPatch 的依赖项?知道了。谢谢。 @SuperCoder:没错。但是,它将加载 MVC 引用的版本(从 ASP.NET Core MVC 1.1 开始为 9.0.1)。如果您想要更新的版本(例如 Json.NET 9.0.2-beta2),那么您需要自己将引用添加到您的应用程序 csproj/project.json 好消息...我发现.Net Core MVC 使用的版本是Newtonsoft.Json v9.0.1【参考方案3】:

这是一个代码 sn-p 用于调整 .net 核心应用程序的设置

public void ConfigureServices(IServiceCollection services)

    services
        .AddMvc()
        .AddJsonOptions(options => 
            // send back a ISO date
            var settings = options.SerializerSettings;
            settings.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.IsoDateFormat;
            // dont mess with case of properties
            var resolver = options.SerializerSettings.ContractResolver as DefaultContractResolver;
            resolver.NamingStrategy = null;
        );

【讨论】:

此代码用于设置 Newtonsoft.json 的默认配置,而不是用于更改序列化程序。 所以这行得通,但我需要特殊情况,即有时我可能只需要 yyyy-MM-dd。我有一个自定义属性,[JsonConverter(typeof(DateOnlyConverter))] 可以与常规 newtonsoft 一起使用,我如何让Microsoft.AspNetCore.Mvc.NewtonsoftJson 识别我的自定义属性?

以上是关于如何在 Asp.net Core Web Api 中默认使用 Newtonsoft.Json?的主要内容,如果未能解决你的问题,请参考以下文章