Json.net 全局设置

本文关键字:全局设置 net Json | 更新日期: 2023-09-27 18:01:04

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

我们遇到的问题是它将所有日期时间都放在UTC中(这是正确的(。出于旧版目的,我们希望默认为本地时间。我不想把下面的代码放在任何地方:

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

Json.net 全局设置

因此,这被添加到 Json.net 5.0 Release 5

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

从发行说明:

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

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

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

是的,确实您可以按照 Lodewijk 的解释设置默认 Json.Net 设置。但 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 Framework(

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;
};