web-dev-qa-db-fra.com

Ignorer une propriété lors de la désérialisation à l'aide de Json.Net avec ItemRequired = Required.Always

J'utilise Json.Net pour sérialiser et désérialiser les classes vers json et retour.

J'ai ajouté à une classe marquée par [JsonObject(ItemRequired = Required.Always)] (ou Required.Always) une nouvelle propriété get-only. Cela se traduit par le JsonSerializationException suivant:

Newtonsoft.Json.JsonSerializationException: propriété requise '<PropertyName>' introuvable dans JSON

Je pensais que marquer cette propriété avec JsonIgnore résoudrait le problème, mais cela ne fonctionne pas.

Comment puis-je dire à Json.Net que cette propriété doit être ignorée?

Voici un exemple minimal reproduisant le problème:

[JsonObject(ItemRequired = Required.Always)]
public class Hamster
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    [JsonIgnore]
    public string FullName { get { return FirstName + LastName; }}
}

private static void Main()
{
    var hamster = new Hamster {FirstName = "Bar", LastName = "Arnon"};
    var serializeObject = JsonConvert.SerializeObject(hamster);
    var deserializeObject = JsonConvert.DeserializeObject<Hamster>(serializeObject);
}
17
i3arnon

Évidemment, JsonIgnore ne contrôlera la sérialisation que dans ce cas. JsonIgnore est requis pour spécifier que la propriété FullName ne doit pas être sérialisée à la représentation json.

Pour ignorer la propriété pendant la désérialisation, nous devons ajouter l'annotation JsonProperty avec Required = Required.Default (ce qui signifie non requis).

Voici donc comment éviter le JsonSerializationException:

[JsonObject(ItemRequired = Required.Always)]
public class Hamster
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    [JsonIgnore]
    [JsonProperty(Required = Required.Default)]
    public string FullName { get { return FirstName + LastName; }}
}
28
i3arnon