web-dev-qa-db-fra.com

Comment définir globalement les options par défaut pour System.Text.Json.JsonSerializer?

MISE À JOUR [23/12/2019]: En partie à cause de la voix contribution de la communauté ce problème a été - ajouté à la feuille de route pour .NET 5.0.

MISE À JOUR [10/10/2019]: Si vous souhaitez voir ce comportement implémenté pourSystem.Text.Json.JsonSerializer dirigez-vous vers le problème ouvert de GitHub souligné par Chris Yungmann et pesez.


Au lieu de cela:

JsonSerializerOptions options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    // etc.
};
JsonSerializer.Deserialize<SomeObject>(someJsonString, options);

Je voudrais faire quelque chose comme ça:

// This property is a pleasant fiction
JsonSerializer.DefaultSettings = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    // etc.
};

// This uses my options
JsonSerializer.Deserialize<SomeObject>(someJsonString); 

// And somewhere else in the same codebase...
// This also uses my options
JsonSerializer.Deserialize<SomeOtherObject>(someOtherJsonString); 

L'espoir est de ne pas avoir à passer une instance de JsonSerializerOptions pour nos cas les plus courants, et de remplacer pour l'exception, pas la règle.

Comme indiqué dans ce q & a , c'est une fonctionnalité utile de Json.Net. J'ai regardé dans la documentation pour System.Text.Json ainsi que ce dépôt GitHub pour .NET Core. Et celui-ci .

Il ne semble pas y avoir d'analogue pour gérer les valeurs par défaut de sérialisation JSON dans .NET Core 3. Ou suis-je en train de l'ignorer?

11
Trevor Reid

Non, JsonSerializerOptions n'expose pas le options par défaut . Si vous utilisez un cadre Web particulier, il peut y avoir un moyen de spécifier les paramètres de (dé-) sérialisation par ce biais. Sinon, je suggère de créer vos propres méthodes pratiques.

Voir aussi ce problème ouvert .

4
Chris Yungmann

Vous pouvez créer une méthode d'extension. Voici un exemple

J'utilise des méthodes distinctes par rapport à la nécessité de créer des paramètres spéciaux, afin que tous les paramètres soient au même endroit et facilement réutilisables.

public static class DeserializeExtensions
{
    private static JsonSerializerOptions defaultSerializerSettings = new JsonSerializerOptions();

    // set this up how you need to!
    private static JsonSerializerOptions featureXSerializerSettings = new JsonSerializerOptions();


    public static T Deserialize<T>(this string json)
    {       
        return JsonSerializer.Deserialize<T>(json, defaultSerializerSettings);
    }

    public static T DeserializeCustom<T>(this string json, JsonSerializerOptions settings)
    {
        return JsonSerializer.Deserialize<T>(json, settings);
    }

    public static T DeserializeFeatureX<T>(this string json)
    {
        return JsonSerializer.Deserialize<T>(json, featureXSerializerSettings);
    }
}

Ensuite, vous l'appelez en tant que méthode sur une chaîne, qu'elle soit littérale ou variable.

    Car result = @"{""Wheels"": 4, ""Doors"": 2}".DeserializeFeatureX<Car>();
3
ps2goat

Les options par défaut ne sont pas exposées dans JsonSerializer pour .NET Core 3.1. Cependant, en décembre 2019, cela a été ajouté à la feuille de route pour 5.0.

La version de .NET 5.0 est prévue novembre 2020. Mais il n'y a aucune garantie que ce problème particulier sera résolu à un moment donné. Outre l'attente, ces réponses suggèrent des solutions:

2
Trevor Reid

Une solution de contournement a été proposée par l'utilisateur GitHub andre-ss6 comme suit:

((JsonSerializerOptions)typeof(JsonSerializerOptions)
    .GetField("s_defaultOptions", 
        System.Reflection.BindingFlags.Static |
        System.Reflection.BindingFlags.NonPublic).GetValue(null))
    .PropertyNameCaseInsensitive = true;
1
Trevor Reid