zoukankan      html  css  js  c++  java
  • Newtonsoft.Json 自定义 解析协议

    在开发web api的时候 遇到一个要把string未赋值默认为null的情况改成默认为空字符串的需求
    这种情况就需要自定义json序列话的 解析协议了

    Newtonsoft.Json默认的解析协议是DefaultContractResolver

    需要继承DefaultContractResolver 自定义解析协议了

     public class NullableValueProvider : IValueProvider
        {
            private readonly object _defaultValue;
            private readonly IValueProvider _underlyingValueProvider;
    
    
            public NullableValueProvider(MemberInfo memberInfo, Type underlyingType)
            {
                _underlyingValueProvider = new DynamicValueProvider(memberInfo);
                if (underlyingType != typeof(string))
                {
                    _defaultValue = Activator.CreateInstance(underlyingType);
                }
                else
                {
                    _defaultValue = string.Empty; // 特殊处理
                }
            }
    
            public void SetValue(object target, object value)
            {
                _underlyingValueProvider.SetValue(target, value);
            }
    
            public object GetValue(object target)
            {
                return _underlyingValueProvider.GetValue(target) ?? _defaultValue;
            }
        }
    
        public class SpecialContractResolver : DefaultContractResolver
        {
            protected override IValueProvider CreateMemberValueProvider(MemberInfo member)
            {
                if (member.MemberType == MemberTypes.Property)
                {
                    var pi = (PropertyInfo)member;
                    
                    if (pi.PropertyType == typeof(string))
                    {
                        return new NullableValueProvider(member, pi.PropertyType);
                    }
                }
                else if (member.MemberType == MemberTypes.Field)
                {
                    var fi = (FieldInfo)member;
                 
                    if (fi.FieldType == typeof(string))
                    {
                        return new NullableValueProvider(member, fi.FieldType);
                    }
                }
    
                return base.CreateMemberValueProvider(member);
            }
        }
    

    参考

  • 相关阅读:
    Java for LeetCode 052 N-Queens II
    Java for LeetCode 051 N-Queens
    Java for LeetCode 050 Pow(x, n)
    Java for LeetCode 049 Anagrams
    15-[JavaScript]-ECMAScript 1
    4-观看答辩有感
    51-小米官网
    14-HTML-CSS案例
    13-[CSS]-postion位置:相relative,绝absolute,固fixed,static(默认),z-index
    12-[CSS]-margin塌陷,margin 0 auto,善用父级的padding
  • 原文地址:https://www.cnblogs.com/yahue/p/4935695.html
Copyright © 2011-2022 走看看