2011-12-21 9 views
7

Sto usando JSON.net per serializzare i miei oggetti EntityFramework.JSON.net JsonIgnoreAttribute non funziona con la proprietà "EntityKey"

In passato, ho creato una classe che applica l'attributo "JsonIgnore" a una proprietà, quindi ho impostato l'attributo "MetadataType" della mia classe EntityFramework principale su quella classe appena creata.

Ecco un esempio:

La classe che verrà applicato alla classe EF:

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

Il file di classe parziale per la classe EF:

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

In precedenza Ad esempio, la proprietà "Utenti" non verrà serializzata durante la serializzazione di un oggetto "Ruolo".

Il mio problema è, questa stessa tecnica non funziona quando aggiungo nella proprietà EntityKey in questo modo:

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

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

Utilizzando questa classe, la proprietà "EntityKey" è ancora serializzato. Che cosa sto facendo di sbagliato?

+0

Codice scritto ben scritto e funzionante. Bene, i due pezzi migliori che dovrebbero funzionare, cioè. –

+0

Ho trovato la risposta alla mia domanda usando la tua domanda! +1 – theMothaShip

risposta

4

si può fare questo implementando il proprio ContractResolver (codice di esempio con JSON.NET 4.5, ma possibile anche con le versioni precedenti)

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

è quindi possibile impostare questa opzione per impostare il ContractResolver per le JsonSerializerSettings oggetto

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

Si noti che non si è limitati a una sola funzione lambda ma è possibile implementare qualsiasi tipo di controllo desiderato. È anche possibile eseguire l'override del convertitore per proprietà per eseguire la serializzazione personalizzata.

2

Penso che le ultime versioni di JSON.NET lo onorino ora. Questo esempio ha funzionato per noi in un sito MVC, ma è possibile utilizzare la stringa come si desidera.

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