Newtonsoft.Json將可空類型轉換爲空字符串(支持所有類型)

第一步:json自定義解析協議

    /// <summary>
    /// json自定義解析協議
    /// </summary>
    public class SpecialJsonContractResolver : DefaultContractResolver
    {
        protected override IValueProvider CreateMemberValueProvider(MemberInfo member)
        {
            if (member.MemberType == MemberTypes.Property)
            {
                var pi = (PropertyInfo)member;
                if (pi.PropertyType == typeof(string) || pi.PropertyType == typeof(DateTime) || pi.PropertyType == typeof(DateTime?))
                {
                    return new NullableJsonValueProvider(pi);
                }
            }
            return base.CreateMemberValueProvider(member);
        }
    }
    
/// <summary> ///空值序列化提供程序 /// </summary> public class NullableJsonValueProvider : IValueProvider { private static readonly string _defaultValue = string.Empty; private readonly PropertyInfo _propertyInfo; public NullableJsonValueProvider(PropertyInfo propertyInfo) { _propertyInfo = propertyInfo; } public void SetValue(object target, object value) { _propertyInfo.SetValue(target, value); } public object GetValue(object target) { return _propertyInfo.GetValue(target) ?? _defaultValue; } }

  

 第二步:空值處理(以時間類型爲例)

 public class DateTimeFormatConverter : IsoDateTimeConverter
    {
        private static readonly string strEmpty = string.Empty;
        public DateTimeFormatConverter(string format)
        {
            DateTimeFormat = format;
        }

        /// <summary>
        /// 重載序列化方法
        /// </summary>
        /// <param name="writer"></param>
        /// <param name="value"></param>
        /// <param name="serializer"></param>
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            if (value == null || value.Equals("") || value.Equals(DateTime.MinValue))
            {
                writer.WriteValue(strEmpty);
            }
            else
            {
                base.WriteJson(writer, value, serializer);
            }
        }
    }

第三步:使用

        public string TestJson()
        {
            JsonSerializerSettings settings = new JsonSerializerSettings();
            settings.Converters.Add(new DecimalDigitsConvert());//只處理decimal類型的屬性         
            settings.Converters.Add(new DateTimeFormatConverter("yyyy/MM/dd"));//默認時間格式處理        
            settings.ContractResolver = new SpecialJsonContractResolver(); //自定義解析協議  

            string json = JsonConvert.SerializeObject(new Models.StudentInfo.StudentInfo_ClassInfo() { ClassName = "班級名稱" }, settings);
            return json;
        }

  

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章