using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; using System.Linq; using System.Collections.Generic; using System.Text; using System.Reflection; namespace APT.Infrastructure.Core { public class JsonContractResolver : DefaultContractResolver { protected override IValueProvider CreateMemberValueProvider(MemberInfo member) { return new JsonExpressionValueProvider(member); } protected override JsonProperty CreatePropertyFromConstructorParameter(JsonProperty matchingMemberProperty, ParameterInfo parameterInfo) { var temp = base.CreatePropertyFromConstructorParameter(matchingMemberProperty, parameterInfo); if (temp.PropertyType.GetUnNullableType() == typeof(Guid) || temp.PropertyType.GetUnNullableType() == typeof(DateTime)) temp.NullValueHandling = NullValueHandling.Include; return temp; } protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { var temp = base.CreateProperty(member, memberSerialization); if (temp.PropertyType.GetUnNullableType() == typeof(Guid) || temp.PropertyType.GetUnNullableType() == typeof(DateTime)) temp.NullValueHandling = NullValueHandling.Include; return temp; } } public class JsonExpressionValueProvider : ExpressionValueProvider, IValueProvider { private readonly MemberInfo _memberInfo; public JsonExpressionValueProvider(MemberInfo memberInfo):base(memberInfo) { _memberInfo = memberInfo; } protected virtual object GetValueByType(Type type) { object obj = null; if (type == typeof(decimal)) obj = decimal.Zero; else if (type == typeof(int)) obj = 0; else if (type == typeof(byte)) obj = byte.MinValue; else if (type == typeof(bool)) obj = false; else if (type == typeof(double)) obj = (double)0; return obj; } public new object GetValue(object target) { object obj = base.GetValue(target); if (obj == null) { Type realType = null; PropertyInfo propertyInfo = _memberInfo as PropertyInfo; if (propertyInfo != null) realType = propertyInfo.PropertyType.GetUnNullableType(); FieldInfo fieldInfo = _memberInfo as FieldInfo; if (fieldInfo != null) realType = fieldInfo.FieldType.GetUnNullableType(); if (realType != null) obj = this.GetValueByType(realType); } return obj; } } }