2012-01-13 14 views
10

tengo una interfaz con una propiedad como esta:Ignorar propiedad definida en la interfaz cuando la serialización utilizando JSON.net

public interface IFoo { 
    // ... 

    [JsonIgnore] 
    string SecretProperty { get; } 

    // ... 
} 

Quiero que el SecretProperty para ser ignorado cuando se serializa todas las clases de ejecución. Pero parece que tengo que definir el atributo JsonIgnore en cada implementación de la propiedad. ¿Hay alguna manera de lograr esto sin tener que agregar el atributo JsonIgnore a cada implementación? No encontré ninguna configuración de serializador que me haya ayudado.

+0

Debe agregar esto como respuesta y aceptarlo, si resuelve su problema. – Groo

+0

Lo hice ahora, pero no pude hacerlo mucho antes porque no podía hacerlo menos de 8 horas después de mi pregunta (y porque no estaba trabajando el fin de semana). – fero

Respuesta

5

Después de un poco de búsqueda, me encontré con esta pregunta:

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

Tomé el código de Jeff esternal y añadió JsonIgnoreAttribute detección, por lo que se parece a esto:

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

Uso esto InterfaceContractResolver en mi JsonSerializerSettings, todas las propiedades que tienen un JsonIgnoreAttribute en cualquier interfaz se ignoran, también, incluso si tienen un JsonPropertyAttribute (debido al orden de la bloques internos if).

1

He encontrado que es más simple crear un DTO de solo las propiedades que deseo y serializar ese objeto a JSON. crea muchos objetos pequeños, específicos del contexto, pero administrar la base de códigos es mucho más fácil y no tengo que pensar en lo que estoy serializando frente a lo que estoy ignorando.

-1

Debe agregar [DataContract] delante del nombre de la clase.

Cambia el valor predeterminado de incluir todas las propiedades para incluir solo propiedades explícitamente marcadas. Después de eso, agregue '[DataMember]' delante de cada propiedad que desee incluir en la salida JSON.

+0

Eso no es absolutamente lo que quiero. Quería que una definición de ignorar en la interfaz pasara a la parte superior de la jerarquía de clases para que el serializador ignore la propiedad de mi interfaz. No quiero que la propiedad sea serializable en ninguna implementación de la interfaz. – fero

Cuestiones relacionadas