Set default global json serializer settings
Solution 1
Setting the JsonConvert.DefaultSettings
did the trick.
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
Formatting = Formatting.Indented,
TypeNameHandling = TypeNameHandling.Objects,
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
Solution 2
Accepted answer did not work for me. In .netcore, I got it working with...
services.AddMvc(c =>
{
....
}).AddJsonOptions(options => {
options.SerializerSettings.Formatting = Formatting.Indented;
....
})
Solution 3
Just do the following in your action so that you can return a content-negotiated response and also your formatter settings can take effect.
return Request.CreateResponse(HttpStatusCode.OK, page);
Solution 4
You're correct about where to set the serializer. However, that serializer is used when the request to your site is made with a requested content type of JSON. It isn't part of the settings used when calling SerializeObject. You could work around this by exposing the JSON serialization settings defined global.asax via a property.
public static JsonSerializerSettings JsonSerializerSettings
{
get
{
return GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
}
}
And then use this property to set the serialization settings when doing serialization within your controllers:
return new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(JsonConvert.SerializeObject(page, WebApiApplication.JsonSerializerSettings))
};
marcus
Updated on July 27, 2022Comments
-
marcus almost 2 years
I'm trying to set the global serializer settings like this in my
global.asax
.var formatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter; formatter.SerializerSettings = new JsonSerializerSettings { Formatting = Formatting.Indented, TypeNameHandling = TypeNameHandling.Objects, ContractResolver = new CamelCasePropertyNamesContractResolver() };
When serializing object using the following code the global serializer settings are not used?
return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(JsonConvert.SerializeObject(page)) };
Isn't it possible to set the global serializer settings like this or am I missing something?
-
marcus about 10 yearsThat worked like a charm, are there any pros or cons by using
Request.CreateResponse
rather then creating anew HttpResponseMessage
like I did in my solution? -
Kiran about 10 yearsyes, you would loose content-negotiation...for example, if a request comes for
application/xml
, you would still be sending back json data ... -
Simon Zyx over 7 yearsi had to set
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings
to the same object to ensure that this config would be used everywhere. (in this case: by webapi and manually invoking via JsonConvert) -
jwize over 6 yearsThis does not work at all. The settings are completely ignored.
-
Steven Pena almost 5 yearsIf you are doing any manual serialization/deserialization using JsonConvert, you will need to use the accepted answer above. So you will need to set both if you want consistency.
-
Amr Ellafy about 3 yearsWorks perfectly. In my case it was an external library used from a ASP.NET Core project. I added the following code to Startup (ConfigureServices)
-
Pavel Biryukov almost 3 yearsBy the way, maybe it's better to store singleton instead of running "new JsonSerializerSettings" every time? What do you think?