使用JsonSerializerSettings在反序列化期间如何忽略属性

时间:2020-09-18 12:29:30

标签: c# .net json.net

是否存在一种在反序列化期间从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(),但是我想避免这种情况。

1 个答案:

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