Newtonsoft.Json序列化时string类型null值显示为string.empty的方案

  JsonConvert.DefaultSettings = () =>
            {
                JsonSerializerSettings settings = new JsonSerializerSettings();
                 settings.ContractResolver = StrNullToEmptyContractResolver.DefaultInstance;
                 return settings;
             };


        class StrNullToEmptyContractResolver : DefaultContractResolver
        {
            public static StrNullToEmptyContractResolver DefaultInstance;
            static StrNullToEmptyContractResolver()
            {
                DefaultInstance = new StrNullToEmptyContractResolver();
            }

            protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
            {
                var jp = base.CreateProperty(member, memberSerialization);
                if (jp.PropertyType != typeof(string))
                {
                    return jp;
                }
                if (jp.ValueProvider is ReflectionValueProvider)
                {
                    jp.ValueProvider = new ReflectionStrNullToEmptyValueProvider(member);
                }
                else if (jp.ValueProvider is DynamicValueProvider)
                {
                    jp.ValueProvider = new DynamicStrNullToEmptyValueProvider(member);
                }
                 return jp;
            }

            class DynamicStrNullToEmptyValueProvider : DynamicValueProvider, IValueProvider
            {
                public DynamicStrNullToEmptyValueProvider(MemberInfo memberInfo) : base(memberInfo)
                {
                }

                public new object GetValue(object target)
                {
                    var value = base.GetValue(target);
                    if (value == null)
                    {
                        return string.Empty;
                    }
                    return value;
                }
            }

            class ReflectionStrNullToEmptyValueProvider : ReflectionValueProvider, IValueProvider
            {
                public ReflectionStrNullToEmptyValueProvider(MemberInfo memberInfo) : base(memberInfo)
                {
                }

                public new object GetValue(object target)
                {
                    var value = base.GetValue(target);
                    if (value == null)
                    {
                        return string.Empty;
                    }
                    return value;
                }
            }
        }

 

posted @ 2018-01-12 17:21  len_lm  阅读(1061)  评论(0)    收藏  举报