Как десериализовать объект с учетом значения свойства?

Десериализация объекта с учетом значения свойства в C# может быть достигнута с использованием специфических атрибутов, таких как JsonIgnore и JsonProperty.

Прежде чем перейти к десериализации с учётом значения свойства, вам необходимо иметь сериализуемый класс, подлежащий десериализации. Предположим, у вас есть класс Person, содержащий свойство Age:

public class Person
{
    public string Name { get; set; }
    
    [JsonIgnore]
    public int Age { get; set; }
}

В этом примере мы использовали атрибут [JsonIgnore] для свойства Age, чтобы указать сериализатору игнорировать это свойство при сериализации и десериализации.

Теперь давайте рассмотрим ситуацию, когда мы хотим выполнить десериализацию с учетом значения свойства. Допустим, у нас есть JSON-строка, содержащая данные о нескольких людях:

[
    {
        "Name": "John",
        "Age": 30
    },
    {
        "Name": "Jane",
        "Age": 25
    }
]

Мы хотим десериализовать только тех людей, у которых Age больше 25 лет. В этом случае нам понадобится пользовательская десериализация. Для этого нам понадобится реализовать интерфейс JsonConverter из пространства имен Newtonsoft.Json:

public class PersonConverter : JsonConverter<Person>
{
    public override Person ReadJson(
        JsonReader reader,
        Type objectType,
        Person existingValue,
        bool hasExistingValue,
        JsonSerializer serializer)
    {
        var jsonObject = JObject.Load(reader);
        var age = (int)jsonObject["Age"];

        if (age > 25)
        {
            return (Person)jsonObject.ToObject(typeof(Person));
        }

        return null;
    }

    public override void WriteJson(
        JsonWriter writer,
        Person value,
        JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

Здесь мы переопределили метод ReadJson, который позволяет нам контролировать логику десериализации для объекта Person. Если значение Age больше 25, мы возвращаем объект Person, иначе возвращаем null.

Теперь мы можем выполнить десериализацию с учетом значения свойства, используя наш пользовательский конвертер:

var settings = new JsonSerializerSettings
{
    Converters = { new PersonConverter() }
};

var people = JsonConvert.DeserializeObject<List<Person>>(json, settings);

Здесь мы создаем экземпляр JsonSerializerSettings, добавляем наш пользовательский конвертер PersonConverter в список конвертеров и передаем настройки десериализатору при вызове метода DeserializeObject.

Теперь у нас будет список объектов Person, содержащих только тех людей, у которых Age больше 25 лет.

В результате, десериализация объекта с учетом значения свойства в C# может быть достигнута с помощью пользовательской десериализации и специфических атрибутов, таких как JsonIgnore и JsonProperty. Это позволяет гибко управлять процессом десериализации и выбирать только необходимую информацию.