Comment définir les paramètres du sérialiseur JSON dans asp.net core 3?

29

JSON paramètres de sérialiseur pour les applications de base de asp.net existants ont été mis en ajoutant AddMvc().AddJsonOptions(), mais je ne pas utiliser AddMvc()dans asp.net core 3. Alors, comment puis-je définir les paramètres globaux de sérialisation json?

Alex Zaitsev
la source
Si vous n'utilisez pas AddMvc, qu'utilisez - vous? Utilisez-vous par exemple AddControllersou n'utilisez -vous pas du tout MVC?
Kirk Larkin du
@KirkLarkin j'utilise la méthode par défaut de construction de l'application asp.net core 3 - app.UseEndpoints(endpoints => { endpoints.MapControllers() })etservices.AddControllers();
Alex Zaitsev
D' accord, donc je suppose que vous utilisez AddControllersdans ConfigureServices, non?
Kirk Larkin du
@KirkLarkin, oui, à droite
Alex Zaitsev

Réponses:

27

AddMvcrenvoie une IMvcBuilderimplémentation, qui a une AddJsonOptionsméthode d'extension correspondante . Les méthodes nouvelles de style AddControllers, AddControllersWithViewset AddRazorPagesrevenir aussi une IMvcBuildermise en œuvre. Chaînez avec ceux-ci de la même manière que vous chaîneriez avec AddMvc:

services.AddControllers()
    .AddJsonOptions(options =>
    {
        // ...
    });

Notez optionsqu'ici n'est plus pour Json.NET, mais pour les System.Text.JsonAPI plus récentes . Si vous souhaitez toujours utiliser Json.NET, consultez la réponse de tymtam

Kirk Larkin
la source
Ajout de "options.JsonSerializerOptions.IgnoreNullValues ​​= true;" n'a eu aucun effet
zion
1
Pour ceux qui ont atteint cette page à la recherche d'une conversion Enum: [JsonConverter (typeof (JsonStringEnumConverter))] public enum SomeEnum
Rafał Praniuk
23

Option A. AddControllers

C'est toujours MVC et nécessite le package de nuget Microsoft.AspNetCore.Mvc.NewtonsoftJson, mais vous avez dit que vous l'utilisiez AddControllers.

À partir de la prise en charge du format JSON basé sur Newtonsoft.Json

services.AddControllers().AddNewtonsoftJson(options =>
{
    // Use the default property (Pascal) casing
    options.SerializerSettings.ContractResolver = new DefaultContractResolver();

    // Configure a custom converter
    options.SerializerOptions.Converters.Add(new MyCustomJsonConverter());
});

Option B. Paramètres par défaut

JsonConvert.DefaultSettings = () => new JsonSerializerSettings (...)

Propriété JsonConvert.DefaultSettings

Obtient ou définit une fonction qui crée JsonSerializerSettings par défaut. Les paramètres par défaut sont automatiquement utilisés par les méthodes de sérialisation sur JsonConvert et ToObject () et FromObject (Object) sur JToken. Pour sérialiser sans utiliser de paramètres par défaut, créez un JsonSerializer avec Create ().

tymtam
la source
Salut, cela définit les paramètres au niveau Json.NET, comment cela peut-il être fait au niveau ASP.NET?
Alex Zaitsev
Il configure les paramètres au niveau ASP.NET, ce qui signifie que ModelBinding par défaut se produit désormais à l'aide du sérialiseur NewtonsoftJson.
MrClan
Merci, l'option A a fonctionné pour moi. Mise à niveau de 2.2 à 3.1 et mon point de terminaison s'est cassé car System.Text.Jsonne gère pas correctement le polymorphisme ou les énumérations. Belle façon simple de changer le sérialiseur par défaut.
static_void
15

L'ajout de Newtonsoft n'est pas nécessaire, ce qui pose un problème lors de l'ajout de packages de compatibilité Newtonsoft sur le projet .Net Core 3.0.

Voir également https://github.com/aspnet/AspNetCore/issues/13564

Bien sûr, on fêterait la dénomination des propriétés PascalCase, NA pour le moment ... Donc nullpour les PropertyNamingPolicymoyens PascalCase, ce qui n'est évidemment pas très bon.

// Pascal casing
services.AddControllersWithViews().
        AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
            options.JsonSerializerOptions.PropertyNamingPolicy = null;
        });
OSP
la source