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

    参考

  • 相关阅读:
    [转]MVP+WCF+三层结构搭建项目框架
    PowerDesigner之PDM(物理概念模型)
    atoi 和 itoa
    最短作业优先(SJF)
    TCP 三次握手过程详解
    TCP/UDP,SOCKET,HTTP,FTP 简析
    计算机的OSI和TCP/IP网络模型
    理解数据成员指针、函数成员指针
    虚函数底层原理
    C++多态有哪几种方式?
  • 原文地址:https://www.cnblogs.com/yahue/p/4935695.html
Copyright © 2011-2022 走看看