2013-12-14 10 views
9

Possiedo un'app di API 2 AngularJS + MVC 5 + Web che consente agli utenti di gestire raccolte di oggetti nel browser e di commettere tutte le modifiche contemporaneamente quando si fa clic su un pulsante Salva. Quando vengono apportate modifiche, una o più proprietà vengono aggiunte agli oggetti JavaScript: IsAdded, IsUpdated, IsRemoved. Le proprietà sono controllate lato server per determinare cosa fare quando si mantiene il modello.Posso chiedere a Json.NET di deserializzare, ma non serializzare, proprietà specifiche?

Il modello è servito con Json.NET tramite API Web, e la classe di base è:

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

Questa grande opera, ma aggiunge cruft al mio JSON serializzato. Posso scegliere di non serializzare queste tre proprietà con ShouldSerialize, ma questo impedisce anche loro di deserializzare.

public bool ShouldSerializeIsAdded() 
{ 
    return false; 
} 

public bool ShouldSerializeIsUpdated() 
{ 
    return false; 
} 

public bool ShouldSerializeIsRemoved() 
{ 
    return false; 
} 

E 'possibile deserializzare, ma non serializzare, proprietà specifiche utilizzando Json.NET?

+1

ShouldSerialize * assolutamente non dovrebbe influire sulla deserializzazione. Ne sei assolutamente sicuro? Perché quello sarebbe un grosso problema –

risposta

12

Si dovrebbe essere in grado di utilizzare solo lo ShouldSerialize * metodi come indicato nella domanda. Queste influiscono solo sulla serializzazione, non sulla deserializzazione.

+0

Grazie per il controllo della realtà. Giuro di averlo testato come descritto nel mio commento sulla risposta di Softlion, ma apparentemente non abbastanza da vicino. La deserializzazione funziona come previsto; il problema non era correlato e specifico per la mia app. – Jared

-3

L'attributo corretto è JsonIgnore.

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

Fonte doc disponibile qui:

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

+1

Per quanto ne so io, JsonIgnore impedisce anche la deserializzazione. Ho provato usando Fiddler per catturare un POST di esempio dove IsAdded = true, quindi ho riprodotto lo stesso POST sia con che senza JsonIgnore sulla mia proprietà IsAdded. Come ha affermato Marc, è correttamente deserializzato in true con ShouldSerializeIsAdded che restituisce false e senza JsonIgnore. L'aggiunta di JsonIgnore ha causato IsAdded = false. – Jared

+1

@Girato davvero, questo renderà la proprietà completamente inutilizzata - non verrà utilizzata neanche durante la deserializzazione. –

Problemi correlati