1

私は車の機能の大きなリストを返すAPIを持っています....すべてがboolまたはintのいずれかです...そして基本的に、intに対してtrue値または> 0を返すものだけを表示したいです。

私は JSON.net を使用しているので、ShouldSerialize() プロパティを使用して、その値に基づいてプロパティをシリアル化する必要があるかどうかを判断できます。コードは次のようになります。

public class Features
{
    public bool ABS { get; set; }

    public bool ShouldSerializeABS()
    {
        // don't serialize the ABS property if ABS is false
        return (ABS != false);
    }


    public bool Immobiliser { get; set; }

    public bool ShouldSerializeImmobiliser ()
    {
        // don't serialize the Immobiliser property if Immobiliser is false
        return (Immobiliser != false);
    }

    public int BHP { get; set; }

    public bool ShouldSerializeBHP  ()
    {
        // don't serialize the BHP property if BHP is false
        return (BHP != 0);
    }
    //..... etc
}

これはうまく機能し、私が求めている結果が得られますが、クラスがすべての ShouldSerialize() プロパティで混乱しないように、これをリファクタリングする方法があるかどうか疑問に思っていましたか?

http://james.newtonking.com/projects/json/help/index.html?topic=html/ConditionalProperties.htmCopyConditionalでプロパティをIContractResolver調べていて、そのような目的で使用できるように見えますが、私はまだリファクタリングしていないように見える多くのコードで終わっているようですIContractResolver

public class ShouldSerializeContractResolver : DefaultContractResolver
{
   public new static readonly ShouldSerializeContractResolver Instance = new ShouldSerializeContractResolver();

   protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
   {
     JsonProperty property = base.CreateProperty(member, memberSerialization);

     if (property.DeclaringType == typeof(Features) && property.PropertyName == "ABS")
     {
         property.ShouldSerialize =
           instance =>
           {
               Features e = (Features)instance;
               return e.ABS != false;
           };
     }
     if (property.DeclaringType == typeof(Features) && property.PropertyName == "Immobiliser")
     {
         property.ShouldSerialize =
           instance =>
           {
               Features e = (Features)instance;
               return e.Immobiliser != false;
           };
     }

    return property;
  }
}

そして、ShouldSerializeContractResolver を使用するこのメソッドは、false の場合、クラスからプロパティを削除していないようです...どんな助けも大歓迎です

4

1 に答える 1