2012-01-13 11 views
10

を使用してシリアライズする際のインタフェースで定義されたプロパティを無視:私はこのような性質とのインタフェースを持っているJSON.net

public interface IFoo { 
    // ... 

    [JsonIgnore] 
    string SecretProperty { get; } 

    // ... 
} 

私はすべて実装するクラスをシリアル化するときSecretPropertyを無視することにしたいです。しかし、それはプロパティのすべての実装でJsonIgnore属性を定義する必要があるようです。すべての実装にJsonIgnore属性を追加することなくこれを達成する方法がありますか?私は助けてくれたシリアライザの設定が見つかりませんでした。

+0

これを回答として追加し、問題が解決したらそれを受け入れる必要があります。 – Groo

+0

私は今のところそれをしましたが、質問よりも8時間も経たないうちに(そして私は週末に働いていなかったので)、それをやり遂げることが許されなかったので、私はずっと早くそれをすることができませんでした。 – fero

答えて

5

は、検索のビットの後、私はこの質問を見つけました:

How to inherit the attribute from interface to object when serializing it using JSON.NET

それは次のようになりますので、私は、ジェフ胸骨によってコードを取り、JsonIgnoreAttribute検出を追加しました:使用

class InterfaceContractResolver : DefaultContractResolver 
{ 
    public InterfaceContractResolver() : this(false) { } 

    public InterfaceContractResolver(bool shareCache) : base(shareCache) { } 

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 
     var property = base.CreateProperty(member, memberSerialization); 
     var interfaces = member.DeclaringType.GetInterfaces(); 
     foreach (var @interface in interfaces) 
     { 
      foreach (var interfaceProperty in @interface.GetProperties()) 
      { 
       // This is weak: among other things, an implementation 
       // may be deliberately hiding an interface member 
       if (interfaceProperty.Name == member.Name && interfaceProperty.MemberType == member.MemberType) 
       { 
        if (interfaceProperty.GetCustomAttributes(typeof(JsonIgnoreAttribute), true).Any()) 
        { 
         property.Ignored = true; 
         return property; 
        } 

        if (interfaceProperty.GetCustomAttributes(typeof(JsonPropertyAttribute), true).Any()) 
        { 
         property.Ignored = false; 
         return property; 
        } 
       } 
      } 
     } 

     return property; 
    } 
} 

このInterfaceContractResolverが私のJsonSerializerSettingsにあります。JsonPropertyAttributeがあっても、どのインターフェイスでもJsonIgnoreAttributeのすべてのプロパティは無視されます(内部ifブロック)。

1

私が望むプロパティだけのDTOを作成し、そのオブジェクトをJSONにシリアル化するのが最も簡単だと分かりました。それは多くの小さなコンテキスト固有のオブジェクトを作成しますが、コードベースを管理する方がはるかに簡単であり、私が何を無視しているのかについて私がシリアル化しているものについて考える必要はありません。

-1

クラス名の前に[DataContract]を追加する必要があります。

デフォルトでは、すべてのプロパティを含むように変更され、明示的にマークされたプロパティのみが含まれます。その後、JSON出力に含める各プロパティの前に '[DataMember]'を追加します。

+0

それは絶対に私が望むものではありません。シリアライザが自分のインターフェイスプロパティを無視するように、インターフェイスの無視された定義をクラス階層の最上位に渡すようにしました。私は、インターフェイスの任意の実装でプロパティをシリアル化する必要はありません。 – fero

関連する問題