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?


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



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 ().


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;
        });
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.