【问题标题】:In an ASP.NET Core Web App, what's the difference between AddJsonOptions and AddJsonFormatters?在 ASP.NET Core Web App 中,AddJsonOptions 和 AddJsonFormatters 有什么区别?
【发布时间】:2018-05-09 13:14:20
【问题描述】:

我正在尝试全面控制 所有 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
};

【问题讨论】:

    标签: c# asp.net json asp.net-core-2.0


    【解决方案1】:

    AddJsonOptions

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

    services.AddMvc()
        .AddJsonOptions(o => 
        {
            o.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            o.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
        });
    

    AddJsonFormatters

    如果您在服务集合上使用准系统 AddMvcCore(),则默认情况下不会设置 JSON 序列化中间件的格式设置 (see the source on GitHub repo)。因此,您需要调用AddJsonFormatters() 来显式设置和配置解析器和序列化器设置:

    services.AddMvcCore()
        .AddJsonFormatters(o =>
        {
            o.ContractResolver = new CamelCasePropertyNamesContractResolver();
            o.NullValueHandling = NullValueHandling.Ignore;
        });
    

    总结

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

    有关AddMvc() 和AddMvcCore() 之间差异的更深入描述,请参阅What is the difference between AddMvc() and AddMvcCore()? 上的精彩帖子

    【讨论】:

    • 完美!答案包括将两个 AND 链接与备份声明进行比较的有用点。谢谢@calc!记录在案:我使用的是AddMvcCore(),所以我将使用AJF 而不是AJO。再次干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 2012-03-16
    相关资源
    最近更新 更多