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