У меня урок
public class SettingsExpires : ViewModelBase
{
private int? frequency;
[JsonProperty("frequency")]
public int? Frequency
{
get => frequency;
set => this.Set(ref frequency, value);
}
}
Где ViewModelBase
— класс abstract
из GalaSoft.MvvmLight. Моя проблема начинается, когда я пытаюсь сериализовать свой класс в json и получаю следующее:
{{ "frequency": null, "IsInDesignMode": false}}
Я получаю IsInDesignMode
из базового класса ViewModelBase
public bool IsInDesignMode { get; }
Как я могу игнорировать это свойство из базового класса? Я пробовал что-то вроде этого:
public class SettingsExpires : ViewModelBase
{
private int? frequency;
[JsonProperty("frequency")]
public int? Frequency
{
get => frequency;
set => this.Set(ref frequency, value);
}
[JsonIgnore]
public new bool IsInDesignMode { get; }
}
Или это:
public class SettingsExpires : ViewModelBase
{
private int? frequency;
[JsonProperty("frequency")]
public int? Frequency
{
get => frequency;
set => this.Set(ref frequency, value);
}
[JsonIgnore]
public bool IsInDesignMode { get; }
}
Но это не работает
3 ответа
Украсив свой производный класс (SettingsExpires
) следующим атрибутом:
[JsonObject(MemberSerialization.OptIn)]
Вы в основном указываете сериализатору включать только те свойства, которые явно аннотированы JsonProperty
. Все остальное будет игнорироваться.
Вы можете определить собственный сопоставитель контрактов, чтобы игнорировать свойства. Например,
public class ShouldSerializeContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
if (property.DeclaringType == typeof(ViewModelBase) && property.PropertyName == "IsInDesignMode")
{
property.ShouldSerialize = x=> false;
}
return property;
}
}
Теперь вы можете сериализовать свои данные, указав преобразователь контракта.
var result = JsonConvert.SerializeObject(
data,
Formatting.Indented,
new JsonSerializerSettings { ContractResolver = new ShouldSerializeContractResolver() }
);
Ану Висван дал (ИМХО) очень хорошее решение.
В качестве альтернативы вы можете использовать атрибут [JsonObject(MemberSerialization.OptIn)] поверх ваших классов для сериализации, что даст вам возможность четко выбирать, какие поля вы хотите сериализовать.
Но у него есть недостаток: вам придется поместить [JsonProperty] для каждого свойства, которое вы хотите в JSON. В некоторых случаях это очень полезно, но может быть утомительно, если вам нужно сериализовать много классов.
Вы можете выбрать, какое решение выглядит лучшим для вас :)
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.
SettingsExpires
с помощью[JsonObject(MemberSerialization.OptIn)]
?