serializeobject serialize property newtonsoft jsonserializersettings jsonproperty jsonignoreattribute jsonignore jsonconvert c# attributes json.net

c# - serialize - NewtonSoft agrega JSONIGNORE en runTime



jsonserializersettings ignore property (4)

No es necesario hacer las cosas complicadas explicadas en la otra respuesta.

NewtonSoft JSON tiene una función incorporada para eso:

public bool ShouldSerializeINSERT_YOUR_PROPERTY_NAME_HERE() { if(someCondition){ return true; }else{ return false; } }

Se llama "serialización de propiedad condicional" y la documentación se puede encontrar aquí .

Advertencia: antes que nada, es importante deshacerse de [JsonIgnore] sobre su propiedad {get;set;} . De lo contrario, sobrescribirá el comportamiento ShouldSerializeXYZ .

Estoy buscando serializar una lista usando NewtonSoft JSON y necesito ignorar una de las propiedades mientras serializo y obtuve el siguiente código

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

Pero estoy usando este Auto de Clase Específica en muchos lugares de mi aplicación y quiero Excluir la opción solo en un lugar.

¿Puedo agregar dinámicamente [JsonIgnore] en el lugar específico donde lo necesito? Cómo puedo hacer eso ?


Creo que sería mejor usar un IContractResolver personalizado para lograr esto:

public class DynamicContractResolver : DefaultContractResolver { private readonly string _propertyNameToExclude; public DynamicContractResolver(string propertyNameToExclude) { _propertyNameToExclude = propertyNameToExclude; } protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization); // only serializer properties that are not named after the specified property. properties = properties.Where(p => string.Compare(p.PropertyName, _propertyNameToExclude, true) != 0).ToList(); return properties; } }

El LINQ puede no ser correcto, no he tenido la oportunidad de probar esto. Luego puede usarlo de la siguiente manera:

string json = JsonConvert.SerializeObject(car, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new DynamicContractResolver("LastModified") });

Consulte la documentación para más información.


Prueba esto:

public static void IgnoreProperty<T, TR>(this T parameter, Expression<Func<T, TR>> propertyLambda) { var parameterType = parameter.GetType(); var propertyName = propertyLambda.GetReturnedPropertyName(); if (propertyName == null) { return; } var jsonPropertyAttribute = parameterType.GetProperty(propertyName).GetCustomAttribute<JsonPropertyAttribute>(); jsonPropertyAttribute.DefaultValueHandling = DefaultValueHandling.Ignore; } public static string GetReturnedPropertyName<T, TR>(this Expression<Func<T, TR>> propertyLambda) { var member = propertyLambda.Body as MemberExpression; var memberPropertyInfo = member?.Member as PropertyInfo; return memberPropertyInfo?.Name; }

Entonces puedes hacer esto:

carObject.IgnoreProperty(so => so.LastModified);


Basado en la publicación @Underscore anterior, creé una lista de propiedades para excluir en la serialización.

public class DynamicContractResolver : DefaultContractResolver { private readonly string[] props; public DynamicContractResolver(params string[] prop) { this.props = prop; } protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { IList<JsonProperty> retval = base.CreateProperties(type, memberSerialization); // retorna todas as propriedades que não estão na lista para ignorar retval = retval.Where(p => !this.props.Contains(p.PropertyName)).ToList(); return retval; } }

Utilizar:

string json = JsonConvert.SerializeObject(car, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new DynamicContractResolver("ID", "CreatedAt", "LastModified") });