Json.net global settings
Is there a way to specify global settings for Json.net?
The problem we're having is that it puts all DateTimes in UTC (rightly so). For legacy purposes, we want to default to Local time. I don't want to put the following code all over the place:
var settings = New JsonSerializerSettings();
settings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
JsonConvert.DeserializeObject(json, settings);
So, this was added to Json.net 5.0 Release 5
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
DateTimeZoneHandling = DateTimeZoneHandling.Local
};
From the release notes:
Set once with
JsonConvert.DefaultSettings
in an application, the default settings will automatically be used by all calls toJsonConvert.SerializeObject
/DeserializeObject
, andJToken.ToObject
/FromObject
. Any user supplied settings to these calls will override the default settings.Because there are cases where JSON should not be customized, e.g. a Facebook or Twitter library, by default
JsonSerializer
won’t useDefaultSettings
, providing an opt-out for those frameworks or for places in your application that shouldn’t use default settings. To create aJsonSerializer
that does use them there is a newJsonSerializer.CreateDefault()
method.
Do note that when ASP.NET invokes Newtonsoft directly, e.g. in model binding or response formatting, it opts out of using these global default settings. To configure defaults used internally by ASP.NET see this answer by Andrei.
Yes, indeed you can setup default Json.Net settings as Lodewijk explained. But Web API uses its own settings and you have to set them separately.
Web API (.NET Core 3.x and later)
In these versions Json.NET is not used by default. To use it, reference the Microsoft.AspNetCore.Mvc.NewtonsoftJson
NuGet package and do:
services.AddControllers()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.Converters.Add(nnew StringEnumConverter());
});
Web API (.NET Core 1.x and 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());
Default Global Settings
Also Json.NET now has an API to setup default global settings:
JsonConvert.DefaultSettings = () =>
{
var settings = new JsonSerializerSettings();
settings.Converters.Add(new StringEnumConverter());
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
return settings;
};