web-dev-qa-db-fra.com

Valeur par défaut pour les propriétés manquantes avec JSON.net

J'utilise Json.net pour sérialiser des objets dans une base de données.

J'ai ajouté une nouvelle propriété à la classe (qui manque dans le json de la base de données) et je veux que la nouvelle propriété ait une valeur par défaut lorsqu'elle est manquante dans le json.

J'ai essayé l'attribut DefaultValue mais cela ne fonctionne pas. J'utilise des setters privés et des constructeurs pour désérialiser le JSON. La définition de la valeur de la propriété dans le constructeur ne fonctionnera donc pas, car il existe un paramètre avec la valeur.

Voici un exemple:

    class Cat
    {
        public Cat(string name, int age)
        {
            Name = name;
            Age = age;
        }

        public string Name { get; private set; }

        [DefaultValue(5)]            
        public int Age { get; private set; }
    }

    static void Main(string[] args)
    {
        string json = "{\"name\":\"mmmm\"}";

        Cat cat = JsonConvert.DeserializeObject<Cat>(json);

        Console.WriteLine("{0} {1}", cat.Name, cat.Age);
    }

Je m'attends à ce que l'âge soit 5 mais c'est zéro.

Aucune suggestion?

52
somdoron

J'ai trouvé la réponse, il suffit d'ajouter l'attribut suivant:

[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]

Dans votre exemple:

class Cat
{
    public Cat(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public string Name { get; private set; }

    [DefaultValue(5)]            
    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
    public int Age { get; private set; }
}

static void Main(string[] args)
{
    string json = "{\"name\":\"mmmm\"}";

    Cat cat = JsonConvert.DeserializeObject<Cat>(json);

    Console.WriteLine("{0} {1}", cat.Name, cat.Age);
}

Voir Référence Json.Net

91
somdoron