有没有办法为 Json.net 指定全局设置?
我们遇到的问题是它将所有 DateTimes 都放在 UTC 中(这是正确的)。出于遗留目的,我们希望默认为当地时间。我不想到处乱写以下代码:
var settings = New JsonSerializerSettings();
settings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
JsonConvert.DeserializeObject(json, settings);
所以,这被添加到Json.net 5.0 Release 5
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
DateTimeZoneHandling = DateTimeZoneHandling.Local
};
从发行说明:
在应用程序中设置一次,所有对/和/
JsonConvert.DefaultSettings
的调用将自动使用默认设置。任何用户为这些调用提供的设置都将覆盖默认设置。JsonConvert.SerializeObject
DeserializeObject
JToken.ToObject
FromObject
因为在某些情况下 JSON 不应该被自定义,例如 Facebook 或 Twitter 库,默认情况下
JsonSerializer
不会使用DefaultSettings
,因此为那些框架或应用程序中不应使用默认设置的地方提供选择退出。要创建一个JsonSerializer
确实使用它们的方法,有一种新JsonSerializer.CreateDefault()
方法。
请注意,当 ASP.NET 直接调用 Newtonsoft 时,例如在模型绑定或响应格式中,它会选择不使用这些全局默认设置。要配置 ASP.NET 内部使用的默认值,请参阅Andrei的这个答案。
是的,您确实可以按照 Lodewijk 的解释设置默认的 Json.Net 设置。但是 Web API 使用自己的设置,您必须单独设置它们。
在这些版本中,默认情况下不使用 Json.NET。要使用它,请参考Microsoft.AspNetCore.Mvc.NewtonsoftJson
NuGet 包并执行以下操作:
services.AddControllers()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.Converters.Add(nnew StringEnumConverter());
});
services.AddMvc(opts =>
{
var jsonFormatter = (JsonOutputFormatter) opts.OutputFormatters
.First(formatter => formatter is JsonOutputFormatter);
jsonFormatter.PublicSerializerSettings.Converters.Add(new StringEnumConverter());
});
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;
};