Игнорировать свойство при десериализации с помощью Json.Net с ItemRequired = Required.Always

Я использую Json.Net для сериализации и десериализации классов для json и back.

Я добавил класс, помеченный [JsonObject(ItemRequired = Required.Always)] (или Required.Always) новым свойством get-only. Это приводит к следующему JsonSerializationException:

Newtonsoft.Json.JsonSerializationException: Обязательное свойство '<PropertyName>' не найдено в JSON

Я думал, что это свойство с JsonIgnore решит проблему, но это не сработает.

Как я могу сообщить Json.Net, что это свойство следует игнорировать?

Вот минимальный пример, воспроизводящий проблему:

[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);
}

Ответ 1

Очевидно, что JsonIgnore будет контролировать сериализацию в этом случае. JsonIgnore требуется указать, что свойство FullName не должно быть сериализовано в представлении json.

Чтобы игнорировать свойство во время десериализации, нам нужно добавить аннотацию JsonProperty с помощью Required = Required.Default (что означает, что это не требуется).

Итак, как избежать 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; }}
}