2012-01-13 10 views
10

mam interfejs z właściwością takiego:Ignoruj ​​właściwości zdefiniowane w interfejsie podczas szeregowania użyciu Json.NET

public interface IFoo { 
    // ... 

    [JsonIgnore] 
    string SecretProperty { get; } 

    // ... 
} 

chcę SecretProperty być ignorowane podczas szeregowania wszystkich klas wykonawczych. Ale wydaje się, że muszę zdefiniować atrybut JsonIgnore dla każdej implementacji właściwości. Czy istnieje sposób na osiągnięcie tego celu bez konieczności dodawania atrybutu JsonIgnore do każdej implementacji? Nie znalazłem żadnego ustawienia serializera, które mi pomogło.

+0

Powinieneś dodać to jako odpowiedź i zaakceptować, jeśli rozwiąże problem. – Groo

+0

Zrobiłem to teraz, ale nie mogłem zrobić tego dużo wcześniej, ponieważ nie mogłem zrobić tego mniej niż 8 godzin po moim pytaniu (i ponieważ nie byłem w pracy w weekend). – fero

Odpowiedz

5

Po chwili poszukiwań, znalazłem to pytanie:

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

wziąłem kod Jeff Sternal i dodał JsonIgnoreAttribute wykrywanie, więc wygląda to tak:

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; 
    } 
} 

Używanie ten InterfaceContractResolver w moim JsonSerializerSettings, wszystkie właściwości, które mają JsonIgnoreAttribute w dowolnym interfejsie są również ignorowane, nawet jeśli mają JsonPropertyAttribute (ze względu na kolejność wewnętrzne bloki if).

1

Odkryłem, że najprościej jest stworzyć DTO tylko z właściwości, które chcę i serializować ten obiekt do JSON. tworzy wiele małych obiektów specyficznych dla kontekstu, ale zarządzanie bazą kodu jest znacznie łatwiejsze i nie muszę myśleć o tym, co serializuję, a co ignoruję.

-1

Powinieneś dodać [DataContract] przed nazwą klasy.

Zmienia wartość domyślną spośród wszystkich właściwości, tak aby zawierała tylko wyraźnie zaznaczone właściwości. Następnie dodaj "[DataMember]" przed każdą właściwością, którą chcesz uwzględnić w wyjściu JSON.

+0

To absolutnie nie to, czego chcę. Chciałem, aby definicja ignorowania w interfejsie była przekazywana na szczyt hierarchii klas, aby serializator zignorował moją właściwość interfejsu. Nie chcę, aby właściwość można było serializować w dowolnej implementacji interfejsu. – fero

Powiązane problemy