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

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

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

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

【问题讨论】:

    标签: c# json.net


    【解决方案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。所以我认为这不是一个正确的答案。
    猜你喜欢
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2014-09-02
    相关资源
    最近更新 更多