web-dev-qa-db-fra.com

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

les paramètres du sérialiseur json pour les applications principales héritées asp.net ont été définis en ajoutant AddMvc().AddJsonOptions(), mais je n'utilise pas AddMvc() dans asp.net core 3. Alors, comment puis-je définir les paramètres de sérialisation json globaux?

28
Alex Zaitsev

AddMvc renvoie une implémentation IMvcBuilder , qui a une méthode d'extension AddJsonOptions correspondante. Les méthodes de nouveau style AddControllers, AddControllersWithViews et AddRazorPages renvoient également une implémentation IMvcBuilder. Chaînez avec ceux-ci de la même manière que vous chaîneriez avec AddMvc:

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

Notez que options ici n'est plus pour Json.NET, mais pour le plus récent System.Text.Json API. Si vous voulez toujours utiliser Json.NET, voir réponse de tymtam

19
Kirk Larkin

Option A. AddControllers

Il s'agit toujours de MVC et nécessite le package de nuget Microsoft.AspNetCore.Mvc.NewtonsoftJson, mais vous avez dit que vous utilisez AddControllers.

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

17
tymtam

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 aussi https://github.com/aspnet/AspNetCore/issues/13564

Bien sûr, on célébrerait le nom de propriété PascalCase, NA pour le moment ... Donc null pour PropertyNamingPolicy signifie PascalCase, ce qui n'est évidemment pas très bon.

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