web-dev-qa-db-fra.com

Définir les paramètres globaux du sérialiseur json par défaut

J'essaie de définir les paramètres globaux du sérialiseur comme ceci dans mon global.asax.

var formatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
formatter.SerializerSettings = new JsonSerializerSettings
{
    Formatting = Formatting.Indented,
    TypeNameHandling = TypeNameHandling.Objects,
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};

Lors de la sérialisation d'un objet à l'aide du code suivant, les paramètres globaux du sérialiseur ne sont pas utilisés?

return new HttpResponseMessage(HttpStatusCode.OK)
{
    Content = new StringContent(JsonConvert.SerializeObject(page))
};

N'est-il pas possible de définir les paramètres globaux du sérialiseur comme ceci ou est-ce que je manque quelque chose?

32
Marcus

Réglage du JsonConvert.DefaultSettings a fait l'affaire.

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
    Formatting = Formatting.Indented,
    TypeNameHandling = TypeNameHandling.Objects,
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};
70
Marcus

La réponse acceptée n'a pas fonctionné pour moi. En .netcore, je l'ai fait travailler avec ...

services.AddMvc(c =>
                 {
                 ....
                 }).AddJsonOptions(options => {
                     options.SerializerSettings.Formatting = Formatting.Indented;
                     ....
                 })
4
Michael

Faites simplement ce qui suit dans votre action afin de pouvoir renvoyer une réponse négociée par le contenu et vos paramètres de mise en forme peuvent également prendre effet.

return Request.CreateResponse(HttpStatusCode.OK, page);
2
Kiran Challa

Vous avez raison de définir le sérialiseur. Cependant, ce sérialiseur est utilisé lorsque la demande à votre site est effectuée avec un type de contenu JSON demandé. Il ne fait pas partie des paramètres utilisés lors de l'appel de SerializeObject. Vous pouvez contourner ce problème en exposant les paramètres de sérialisation JSON définis global.asax via une propriété.

public static JsonSerializerSettings JsonSerializerSettings
{
    get
    {
        return GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
    }
}

Et puis utilisez cette propriété pour définir les paramètres de sérialisation lorsque vous effectuez la sérialisation dans vos contrôleurs:

return new HttpResponseMessage(HttpStatusCode.OK)
{
    Content = new StringContent(JsonConvert.SerializeObject(page, WebApiApplication.JsonSerializerSettings))
};
1
Scott Corbett