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);
            }
        }
    

    参考

  • 相关阅读:
    Visual Studio Code插件安装步骤
    JS省城级联
    JS省城级联
    JS省城级联
    JS省城级联
    【JAVA零基础入门系列】Day9 Java中的那个大数值
    【JAVA零基础入门系列】Day9 Java中的那个大数值
    【JAVA零基础入门系列】Day9 Java中的那个大数值
    [js插件开发教程]实现一个比较完整的开源级选项卡插件
    VS2017桌面应用程序打包成.msi或者.exe
  • 原文地址:https://www.cnblogs.com/yahue/p/4935695.html
Copyright © 2011-2022 走看看