2011-12-21 14 views
7

Używam JSON.net do serializacji moich obiektów EntityFramework.JSON.net JsonIgnoreAttribute nie działa z właściwością "EntityKey"

W przeszłości utworzyłem klasę, która stosuje atrybut "JsonIgnore" do właściwości, a następnie ustawiam atrybut "MetadataType" mojej głównej klasy EntityFramework na nowo utworzoną klasę.

Oto przykład:

klasy, która będzie stosowana do klasy EF

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

częściowego pliku klasy dla klasy EF

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

w powyższym na przykład właściwość "Użytkownicy" nie zostanie przekształcona do postaci szeregowej podczas serializowania obiektu "Rola".

Moim problemem jest to ta sama technika nie działa, gdy dodam w nieruchomości EntityKey tak:

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

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

Używając tej klasie, „EntityKey” własność jest nadal w odcinkach. Co ja robię źle?

+0

Dobrze napisany i działający kod. Cóż, to są dwa najlepsze bity, które mają działać. –

+0

Znalazłem odpowiedź na moje pytanie, używając Twojego pytania! +1 – theMothaShip

Odpowiedz

4

można to zrobić poprzez wdrożenie własnego ContractResolver (przykładowy kod z JSON.NET 4.5, ale również ze starszymi wersjami)

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

można ustawić to ustawienie ContractResolver dla Twoich JsonSerializerSettings sprzeciw

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

Pamiętaj, że nie jesteś ograniczony tylko do jednej funkcji lambda, ale możesz wdrożyć dowolną kontrolę. Możesz nawet zastąpić Konwerter dla każdej właściwości, aby wykonać niestandardową serializację.

2

Myślę, że najnowsze wersje JSON.NET już teraz to honorują. Ta próbka działała dla nas w witrynie MVC, ale możesz użyć łańcucha, jak tylko chcesz.

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