How to exclude property from Json Serialization

后端 未结 7 1387
粉色の甜心
粉色の甜心 2020-11-22 13:22

I have a DTO class which I Serialize

Json.Serialize(MyClass)

How can I exclude a public property of it?

(It has to

7条回答
  •  北海茫月
    2020-11-22 13:41

    If you are not so keen on having to decorate code with Attributes as I am, esp when you cant tell at compile time what will happen here is my solution.

    Using the Javascript Serializer

        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
            }
        }
    

提交回复
热议问题