Come escludere la proprietà da Json Serialization

Ho una class DTO che serializzo

Json.Serialize(MyClass) 

Come posso escludere una proprietà pubblica di esso?

(Deve essere pubblico, dato che lo uso nel mio codice da qualche altra parte)

Puoi mettere un attributo ScriptIgnore sui membri che non dovrebbe essere serializzato. Guarda l’esempio preso da qui :

Considera il seguente caso (semplificato):

 public class User { public int Id { get; set; } public string Name { get; set; } [ScriptIgnore] public bool IsComplete { get { return Id > 0 && !string.IsNullOrEmpty(Name); } } } 

In questo caso, solo le proprietà Id e Name saranno serializzate, quindi l’object JSON risultante sarà simile a questo:

 { Id: 3, Name: 'Test User' } 

PS. Non dimenticare di aggiungere un riferimento a ” System.Web.Extensions ” affinché funzioni

Se si utilizza Json.Net, l’attributo [JsonIgnore] semplicemente ignorerà il campo / la porosità durante la serializzazione o la deserializzazione.

 public class Car { // included in JSON public string Model { get; set; } public DateTime Year { get; set; } public List Features { get; set; } // ignored [JsonIgnore] public DateTime LastModified { get; set; } } 

Oppure puoi utilizzare l’attributo DataContract e DataMember per serializzare in modo selettivo / deserializzare proprietà / campi.

 [DataContract] public class Computer { // included in JSON [DataMember] public string Name { get; set; } [DataMember] public decimal SalePrice { get; set; } // ignored public string Manufacture { get; set; } public int StockCount { get; set; } public decimal WholeSalePrice { get; set; } public DateTime NextShipmentDate { get; set; } } 

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

Puoi usare [ScriptIgnore] :

 public class User { public int Id { get; set; } public string Name { get; set; } [ScriptIgnore] public bool IsComplete { get { return Id > 0 && !string.IsNullOrEmpty(Name); } } } 

Riferimento qui

In questo caso, l’ID e il nome verranno serializzati

Se non sei così appassionato di dover decorare il codice con Attributi come sono, specialmente quando non puoi raccontare al momento della compilazione quello che accadrà qui è la mia soluzione.

Utilizzo del serializzatore Javascript

  public static class JsonSerializerExtensions { public static string ToJsonString(this object target,bool ignoreNulls = true) { var javaScriptSerializer = new JavaScriptSerializer(); if(ignoreNulls) { javaScriptSerializer.RegisterConverters(new[] { new PropertyExclusionConverter(target.GetType(), true) }); } return javaScriptSerializer.Serialize(target); } public static string ToJsonString(this object target, Dictionary> ignore, bool ignoreNulls = true) { var javaScriptSerializer = new JavaScriptSerializer(); foreach (var key in ignore.Keys) { javaScriptSerializer.RegisterConverters(new[] { new PropertyExclusionConverter(key, ignore[key], ignoreNulls) }); } return javaScriptSerializer.Serialize(target); } } public class PropertyExclusionConverter : JavaScriptConverter { private readonly List propertiesToIgnore; private readonly Type type; private readonly bool ignoreNulls; public PropertyExclusionConverter(Type type, List propertiesToIgnore, bool ignoreNulls) { this.ignoreNulls = ignoreNulls; this.type = type; this.propertiesToIgnore = propertiesToIgnore ?? new List(); } public PropertyExclusionConverter(Type type, bool ignoreNulls) : this(type, null, ignoreNulls){} public override IEnumerable SupportedTypes { get { return new ReadOnlyCollection(new List(new[] { this.type })); } } public override IDictionary Serialize(object obj, JavaScriptSerializer serializer) { var result = new Dictionary(); if (obj == null) { return result; } var properties = obj.GetType().GetProperties(); foreach (var propertyInfo in properties) { if (!this.propertiesToIgnore.Contains(propertyInfo.Name)) { if(this.ignoreNulls && propertyInfo.GetValue(obj, null) == null) { continue; } result.Add(propertyInfo.Name, propertyInfo.GetValue(obj, null)); } } return result; } public override object Deserialize(IDictionary dictionary, Type type, JavaScriptSerializer serializer) { throw new NotImplementedException(); //Converter is currently only used for ignoring properties on serialization } }