21

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

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

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

2 回答 2

34

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

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
    DateTimeZoneHandling = DateTimeZoneHandling.Local
};

发行说明

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

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

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

于 2013-05-08T11:05:23.800 回答
13

是的,您确实可以按照 Lodewijk 的解释设置默认的 Json.Net 设置。但是 Web API 使用自己的设置,您必须单独设置它们。

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

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

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;
};
于 2017-06-20T00:47:09.377 回答