Ответ 1
Существует два разных подхода к вашей проблеме.
Вы должны выбрать первый вариант, если вы собираетесь чаще менять свои классы, потому что первый подход позволяет забыть сериализовать недавно добавленное свойство. Кроме того, он гораздо более многоразовый, если вы хотите добавить еще один класс, который вы хотите сериализовать таким же образом.
Если у вас есть только эти два класса, и, скорее всего, они не изменятся, вы можете выбрать второй подход, чтобы ваше решение было простым.
1. Используйте настраиваемый конвертер, чтобы выбрать все свойства int
Первый подход заключается в использовании пользовательского JsonConverter
, который сериализует класс или структуру, включая свойства, имеющие тип int
. Код может выглядеть так:
class IntPropertyConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
// this converter can be applied to any type
return true;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// we currently support only writing of JSON
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value == null)
{
serializer.Serialize(writer, null);
return;
}
// find all properties with type 'int'
var properties = value.GetType().GetProperties().Where(p => p.PropertyType == typeof(int));
writer.WriteStartObject();
foreach (var property in properties)
{
// write property name
writer.WritePropertyName(property.Name);
// let the serializer serialize the value itself
// (so this converter will work with any other type, not just int)
serializer.Serialize(writer, property.GetValue(value, null));
}
writer.WriteEndObject();
}
}
Затем вы должны украсить свой класс с помощью JsonConverterAttribute
:
[JsonConverter(typeof(IntPropertyConverter))]
public class UrlStats
{
// ...
}
Отказ от ответственности: этот код был протестирован только очень грубо.
2. Выберите свойства индивидуально
Второе решение выглядит несколько проще: вы можете использовать JsonIgnoreAttribute
для украшения атрибутов, которые вы хотите исключить для сериализации. В качестве альтернативы вы можете переключиться с "черного списка" на "белый список", явно включив атрибуты, которые вы хотите сериализовать. Вот несколько примеров кода:
Черный список: (я изменил свойства для лучшего обзора)
[JsonObject(MemberSerialization.OptOut)] // this is default and can be omitted
public class UrlStats
{
[JsonIgnore] public string URL { get; set; }
[JsonIgnore] public List<Stats> TotalPages { get; set; }
[JsonIgnore] public List<Stats> TotalTitles { get; set; }
[JsonIgnore] public List<Stats> DuplicateTitles { get; set; }
[JsonIgnore] public List<Stats> OverlengthTitles { get; set; }
public int TotalPagesFound { get; set; }
public int TotalTitleTags { get; set; }
public int NoDuplicateTitleTags { get; set; }
public int NoOverlengthTitleTags { get; set; }
}
Белый список: (также переупорядочено)
[JsonObject(MemberSerialization.OptIn)] // this is important!
public class UrlStats
{
public string URL { get; set; }
public List<Stats> TotalPages { get; set; }
public List<Stats> TotalTitles { get; set; }
public List<Stats> DuplicateTitles { get; set; }
public List<Stats> OverlengthTitles { get; set; }
[JsonProperty] public int TotalPagesFound { get; set; }
[JsonProperty] public int TotalTitleTags { get; set; }
[JsonProperty] public int NoDuplicateTitleTags { get; set; }
[JsonProperty] public int NoOverlengthTitleTags { get; set; }
}