在ASP.NET Core Web App中,AddJsonOptions和AddJsonFormatters之间的区别是什么?

Pur*_*ome 9 c# asp.net json asp.net-core-2.0

我试图控制所有 json输出设置,就像正常的HTTP 200 OK结果一样,当模型验证失败时(HTTP 400 BAD请求)等.

我遇到了以下两种方法startup.cs: -

  • AddJsonOptions(options => ...)
  • AddJsonFormatters(options => ...)

有人可以解释这两者之间的区别吗?为什么我会用一个而不是另一个?

FWIW,我也试图使用Newtonsoft JSON作为我的json提供商,其设置如下:

var settings = new JsonSerializerSettings
{
    ContractResolver = new CamelCasePropertyNamesContractResolver(),
    Formatting = Formatting.None,
    NullValueHandling = NullValueHandling.Ignore,
    DateFormatHandling = DateFormatHandling.IsoDateFormat
};
Run Code Online (Sandbox Code Playgroud)

干杯!

Cal*_*alC 13

AddJsonOptions

这提供了通过调用.AddMvc()服务集合来配置已经设置的serailization设置和合同解析器的方法.您可以从已经调用过的源代码中看到.因此,JSON.net将用于使用DefaultContractResolver进行序列化,提供默认设置.但是,您可以在这种情况下使用覆盖默认值并指定所需的合约解析程序和序列化程序设置,例如AddJsonFormatters()AddMvc()AddJsonOptions()

services.AddMvc()
    .AddJsonOptions(o => 
    {
        o.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        o.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
    });
Run Code Online (Sandbox Code Playgroud)

AddJsonFormatters

如果您AddMvcCore()在服务集合上使用准系统,则默认情况下不会设置JSON序列化中间件的格式化(请参阅GitHub存储库上的源代码).因此,您需要调用AddJsonFormatters()以显式设置和配置解析程序和序列化程序设置:

services.AddMvcCore()
    .AddJsonFormatters(o =>
    {
        o.ContractResolver = new CamelCasePropertyNamesContractResolver();
        o.NullValueHandling = NullValueHandling.Ignore;
    });
Run Code Online (Sandbox Code Playgroud)

摘要

您可以看到这两种方法非常相似.它们都存在的唯一原因是因为AddMvcCore()允许您设置或创建自己的序列化中间件.如果你喜欢提供的准系统设置,AddMvcCore()但想要使用当时提供的JSON序列化格式,AddMvc()只需调用即可services.AddMvcCore().AddJsonFormatters().

对于之间的差异更深入的描述AddMvc()AddMvcCore()看到优秀的岗位是什么AddMvc()和AddMvcCore()有什么区别?