Json.net 全局设置

Posted

技术标签:

【中文标题】Json.net 全局设置【英文标题】:Json.net global settings 【发布时间】:2013-02-25 12:22:54 【问题描述】:

有没有办法为 Json.net 指定全局设置?

我们遇到的问题是它将所有 DateTimes 都放在 UTC 中(这是正确的)。出于遗留目的,我们希望默认为当地时间。我不想到处乱写下面的代码:

var settings = New JsonSerializerSettings();
settings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
JsonConvert.DeserializeObject(json, settings);

【问题讨论】:

【参考方案1】:

所以,这被添加到Json.net 5.0 Release 5

JsonConvert.DefaultSettings = () => new JsonSerializerSettings

    DateTimeZoneHandling = DateTimeZoneHandling.Local
;

来自release notes:

在应用程序中使用JsonConvert.DefaultSettings 设置一次,默认设置将自动用于所有对JsonConvert.SerializeObject/DeserializeObjectJToken.ToObject/FromObject 的调用。任何用户为这些调用提供的设置都将覆盖默认设置。

因为在某些情况下不应自定义 JSON,例如Facebook 或 Twitter 库,默认情况下 JsonSerializer 不会使用 DefaultSettings,为这些框架或应用程序中不应使用默认设置的位置提供选择退出。要创建一个确实使用它们的JsonSerializer,有一个新的JsonSerializer.CreateDefault() 方法。

请注意,当 ASP.NET 直接调用 Newtonsoft 时,例如在模型绑定或响应格式中,它选择不使用这些全局默认设置。要配置 ASP.NET 内部使用的默认值,请参阅this answer by Andrei。

【讨论】:

在设置ContractResolver的情况下不起作用,我还不知道为什么。它根本不适用。 JsonConvert.SerializeObject(obj, new JsonSerializerSettings ContractResolver = new NHibernateContractResolver() ); 是的,抱歉,我尝试了 JSON NET 5.05 和 6 - 根据建议的代码设置全局 ContractResolver 不起作用。每次后续调用 JsonConvert.SerializeObject() 时都不会调用这些设置 @PandaWood 我发现使用这种技术设置默认合同解析器通常适用于 json.net,但不适用于 Web API(至少版本 5.2.2)。似乎 Web API 配置中的某些内容覆盖了默认的合同解析器并将其设置为自己的。当然,不确定您的用例是否特定于 Web API。 @JeremyCook 请看我的回答【参考方案2】:

是的,您确实可以将默认 Json.Net 设置设置为 Lodewijk explained。但是 Web API 使用自己的设置,您必须单独设置。

Web API(.NET Core 3.x 及更高版本)

在这些版本中,默认情况下不使用 Json.NET。要使用它,请参考Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet 包并执行以下操作:

services.AddControllers()
.AddNewtonsoftJson(options => 

    options.SerializerSettings.Converters.Add(nnew StringEnumConverter());
);

Web API(.NET Core 1.x 和 2.x)

services.AddMvc(opts =>

    var jsonFormatter = (JsonOutputFormatter) opts.OutputFormatters
        .First(formatter => formatter is JsonOutputFormatter);
    jsonFormatter.PublicSerializerSettings.Converters.Add(new StringEnumConverter());
);

Web API(.NET 框架)

var config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters
    .Add(new StringEnumConverter());

默认全局设置

Json.NET 现在也有一个 API 来设置默认的全局设置:

JsonConvert.DefaultSettings = () =>

    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new StringEnumConverter());
    settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    return settings;
;

【讨论】:

这只影响控制器边界上的处理,afaik。所以我认为这不是一个正确的答案。

以上是关于Json.net 全局设置的主要内容,如果未能解决你的问题,请参考以下文章

Json.NET MissingMemberHandling 设置

使用 Json.Net 序列化时指定自定义 DateTime 格式

如何在 ASP.NET Web API 中为 Json.NET 设置自定义 JsonSerializerSettings?

是否可以将Json.Net设置为忽略$ type?

如何让 Json.NET 为具有复杂值的属性设置 IsSpecified 属性?

如何将 Json.Net 设置为 WCF REST 服务的默认序列化程序