【问题标题】:How to use Newtonsoft.Json as default in Asp.net Core Web Api?如何在 Asp.net Core Web Api 中默认使用 Newtonsoft.Json?
【发布时间】: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 中完成这一切?在哪里更改默认格式化程序

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

谢谢

【问题讨论】:

    标签: json serialization asp.net-web-api asp.net-core json.net


    【解决方案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 识别我的自定义属性?
      猜你喜欢
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 2020-05-31
      • 1970-01-01
      • 2018-05-23
      • 2021-03-01
      • 1970-01-01
      相关资源
      最近更新 更多