如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 ASP.NET Core Web API 中使用 MassTransit 事件总线?

如何在 asp.net core web api 中绑定 Json Query 字符串

ASP.NET Core Web API - 如何在中间件管道中隐藏 DbContext 事务?

Asp.Net Core Web API 应用程序:如何更改监听地址?

如何在 ASP.NET Core Web API 中添加两个不同的令牌