Set default global json serializer settings

65,917

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))
};
Share:
65,917
marcus
Author by

marcus

Updated on July 27, 2022

Comments

  • marcus
    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
    marcus about 10 years
    That worked like a charm, are there any pros or cons by using Request.CreateResponse rather then creating a new HttpResponseMessage like I did in my solution?
  • Kiran
    Kiran about 10 years
    yes, you would loose content-negotiation...for example, if a request comes for application/xml, you would still be sending back json data ...
  • Simon Zyx
    Simon Zyx over 7 years
    i had to set GlobalConfiguration.Configuration.Formatters.JsonFormatter.S‌​erializerSettings to the same object to ensure that this config would be used everywhere. (in this case: by webapi and manually invoking via JsonConvert)
  • jwize
    jwize over 6 years
    This does not work at all. The settings are completely ignored.
  • Steven Pena
    Steven Pena almost 5 years
    If 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
    Amr Ellafy about 3 years
    Works 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
    Pavel Biryukov almost 3 years
    By the way, maybe it's better to store singleton instead of running "new JsonSerializerSettings" every time? What do you think?