第一步: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; }