是否存在一种在反序列化期间从JSON动态排除属性的方法? JSON示例:
{"time":1516176813,"signature":"IS1cJRqj1FVyTWWDhFpFVw==","data":"ab9984617a6ec835844bacbd47bfb59c"}
在这里,我想排除“ si”属性,并且扩展了DefaultContractResolver:
public class IgnorePropertiesResolver : DefaultContractResolver
{
private readonly HashSet<string> _ignoreProps;
public IgnorePropertiesResolver(IEnumerable<string> propNamesToIgnore)
{
_ignoreProps = new HashSet<string>(propNamesToIgnore);
}
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
if (_ignoreProps.Contains(property.PropertyName))
{
property.ShouldSerialize = _ => false;
property.ShouldDeserialize = _ => false;
}
return property;
}
}
但是,当我调用DeserializeObject方法时,该属性仍然存在。
var ignoredProperties = new List<string> { "si" };
JsonConvert.DeserializeObject<T>(source, new JsonSerializerSettings
{
ContractResolver = new IgnorePropertiesResolver(ignoredProperties)
});
我知道我可以使用JObject.Property(propertyName).Remove()
,但是我想避免这种情况。
答案 0 :(得分:0)
您可以使用自定义JsonConverter代替ContractResolver:
public class IgnorePropertyConverter<T> : JsonConverter
where T : new()
{
private readonly HashSet<string> _ignoreProps;
public IgnorePropertyConverter(IEnumerable<string> propNamesToIgnore)
{
_ignoreProps = new HashSet<string>(propNamesToIgnore);
}
public override bool CanConvert(Type objectType)
{
return typeof(T).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject jobject = JObject.Load(reader);
var model = new T();
foreach (var prop in _ignoreProps)
jobject.Remove(prop);
serializer.Populate(jobject.CreateReader(), model);
return model;
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
class MyModel
{
public int Time { get; set; }
public string Data { get; set; }
}
var myModel = JsonConvert.DeserializeObject<MyModel>(json, new IgnorePropertyConverter<MyModel>(new List<string> { "signature" }));