あなたの問題には2つの異なるアプローチがあります。
クラスをより頻繁に変更する場合は、最初のアプローチを選択する必要があります。最初のアプローチでは、新しく追加されたプロパティをシリアル化するのを忘れるのを防ぐためです。さらに、同じ方法でシリアライズしたい別のクラスを追加したい場合は、はるかに再利用可能です。
これら 2 つのクラスしかなく、変更される可能性がほとんどない場合は、2 番目のアプローチを選択してソリューションをシンプルに保つことができます。
1. カスタム コンバーターを使用してすべてのint
プロパティを選択する
最初のアプローチは、JsonConverter
type を持つプロパティのみを含めることによってクラスまたは構造体をシリアル化するカスタムを使用すること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. プロパティを個別に選択する
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; }
}