2011-12-21 13 views
7

Estoy usando JSON.net para serializar mis objetos EntityFramework.JSON.net JsonIgnoreAttribute no funciona con la propiedad "EntityKey"

En el pasado, he creado una clase que aplica el atributo "JsonIgnore" a una propiedad, y luego establezco el atributo "MetadataType" de mi clase EntityFramework principal en esa clase recién creada.

Aquí es un ejemplo:

La clase que se aplicará a la clase de EF:

public class Role_DoNotSerialize 
    { 
     [JsonIgnore] 
     public string Users { get; set; } 
    } 

El archivo de clase parcial para la clase de EF:

[MetadataType(typeof(Role_DoNotSerialize))] 
    public partial class Role 
    { 
    } 

En lo anterior Por ejemplo, la propiedad "Usuarios" no se serializará al serializar un objeto "Rol".

Mi problema es que esta misma técnica no funciona cuando agrego en la propiedad EntityKey así:

public class Role_DoNotSerialize 
    { 
     [JsonIgnore] 
     public string Users { get; set; } 

     [JsonIgnore] 
     public System.Data.EntityKey EntityKey { get; set; } 
    } 

El uso de esta clase, la propiedad "EntityKey" sigue siendo serializado. ¿Qué estoy haciendo mal?

+0

Bien escrito y buen código de trabajo. Bueno, los dos bits superiores que se supone que funcionan, eso es. –

+0

¡Encontré la respuesta a mi pregunta usando tu pregunta! +1 – theMothaShip

Respuesta

4

se puede hacer esto mediante la implementación de su propio ContractResolver (código de ejemplo, con JSON.NET 4.5, pero también es posible con las versiones anteriores)

public class ExcludeEntityKeyContractResolver : DefaultContractResolver 
{ 
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) 
    { 
     IList<JsonProperty> properties = base.CreateProperties(type,memberSerialization); 
     return properties.Where(p => p.PropertyType != typeof (System.Data.EntityKey)).ToList(); 
    } 
} 

A continuación, puede configurar esto para establecer el ContractResolver para sus JsonSerializerSettings objeto

JsonSerializerSettings serializerSettings = new JsonSerializerSettings(); 
serializerSettings.ContractResolver = new ExcludeEntityKeyContractResolver(); 

Tenga en cuenta que no se limita a esa función lambda, sino que puede implementar cualquier tipo de controles que desee. Incluso puede anular el convertidor por propiedad para hacer una serialización personalizada.

2

Creo que las últimas versiones de JSON.NET honran esto ahora. Este ejemplo funcionó para nosotros en un sitio MVC, pero podría usar la cadena como lo desee.

public ActionResult ContentJsonFormatted(object obj, Formatting formatting = Formatting.Indented) 
{ 
    string result = JsonConvert.SerializeObject(obj, formatting); 
    return Content(result, "text/plain"); 
} 
Cuestiones relacionadas