如何在 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.Net
将Serializing
数据转换为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?的主要内容,如果未能解决你的问题,请参考以下文章