2013-12-14 10 views
9

Mam aplikację AngularJS + MVC 5 + Web API 2, która pozwala użytkownikom zarządzać kolekcjami obiektów w przeglądarce i zatwierdzać wszystkie zmiany naraz po kliknięciu przycisku Zapisz. W miarę wprowadzania zmian do obiektów JavaScript jest dodawana jedna lub więcej właściwości: IsAdded, IsUpdated, IsRemoved. Właściwości są sprawdzane po stronie serwera, aby określić, co zrobić, gdy model zostanie utrzymany.Czy mogę polecić Json.NET, aby deserializować, ale nie szeregować, konkretnych właściwości?

Model serwowane jest przy użyciu Json.NET poprzez Web API, a klasa bazowa jest:

public class CollectionItemViewModel : ICollectionItem 
{ 
    public bool IsAdded { get; set; } 
    public bool IsUpdated { get; set; } 
    public bool IsRemoved { get; set; } 
} 

Działa to doskonale, ale dodaje do mojego cruft serializowanym JSON. Mogę zdecydować, aby nie serializować tych trzech właściwości za pomocą ShouldSerialize, ale to również zapobiega ich deserializacji.

public bool ShouldSerializeIsAdded() 
{ 
    return false; 
} 

public bool ShouldSerializeIsUpdated() 
{ 
    return false; 
} 

public bool ShouldSerializeIsRemoved() 
{ 
    return false; 
} 

Czy można deserializować, ale nie szeregować określonych właściwości za pomocą Json.NET?

+1

Powinno się używać Serializacji * w sposób absolutnie nie wpływający na deserializację. Czy jesteś tego absolutnie pewien? Ponieważ to byłby poważny błąd. –

Odpowiedz

12

Powinieneś być w stanie po prostu użyć ShouldSerialize * metody, jak pokazano w pytaniu. To tylko wpływa na serializację, a nie na deserializację.

+0

Dzięki za sprawdzenie rzeczywistości. Przysięgam, że testowałem to tak, jak to opisano w moim komentarzu do odpowiedzi Softlion, ale najwyraźniej nie było to wystarczająco dokładne. Deserializacja działa zgodnie z oczekiwaniami; problem nie był związany z moją aplikacją. – Jared

-3

Poprawnym atrybutem jest JsonIgnore.

[JsonIgnore] 
public int Id {get;set;} 

Źródło doc dostępny tutaj:

http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size

+1

O ile wiem, JsonIgnore zapobiega także deserializacji. Przetestowałem za pomocą narzędzia Fiddler, aby przechwycić przykładowy test POST, w którym IsAdded = true, a następnie odtworzyć ten sam test POST zarówno zi bez JsonIgnore w mojej właściwości IsAdded. Jak zapewnił Marc, poprawnie deserializował się na true, gdy ShouldSerializeIsAdded zwracał wartość false i bez JsonIgnore. Dodanie JsonIgnore spowodowało IsAdded = false. – Jared

+1

@Jardzo istotnie sprawi to, że właściwość będzie całkowicie nieużywana - nie będzie również używana podczas deserializacji. –