Newtonsoft(json.net)字符串NULL 返回空串 数组返回[]

背景介绍:

在项目中,json序列化时不时会遇到这种需求:字符串类型,空值,不要返回NULL,返回“”;数组,空值返回[];对象,空值返回{}。

(PS:如果在做手机项目,不建议空值还进行序列化,建议采用框架的处理思路:

NullValueHandling = NullValueHandling.Ignore ,这样明显能省网络流量) 

 

(1)该问题网上找了好久没找到解决方案,自己看了json.net源码做了一个实现思路。

如果高手们知道其他的方法实现这个需求,望赐教,谢谢。

 public class DynamicValueProviderEx : IValueProvider
    {
        protected readonly MemberInfo _memberInfo;
        protected DynamicValueProvider _innerValueProvider;

        public DynamicValueProviderEx(MemberInfo memberInfo)
        {
            _memberInfo = memberInfo;
            _innerValueProvider = new DynamicValueProvider(memberInfo);
        }

        public Object GetValue(object target)
        {
       //在这里可以做很多处理,可以在序列化的时候对敏感数据进行屏蔽等等 Object value = _innerValueProvider.GetValue(target); if (value == null) { PropertyInfo property = _memberInfo as PropertyInfo; FieldInfo field = property == null ? _memberInfo as FieldInfo : null; Type memberType = property == null ? field.FieldType : property.PropertyType; if (memberType == typeof(String)) return ""; else if (typeof(IEnumerable).IsAssignableFrom(memberType)) return new object[] { }; else if (memberType.IsClass) return new object(); } return value; } public void SetValue(object target, object value) { _innerValueProvider.SetValue(target, value); } }

  

自己再重写DefaultContractResolver的CreateMemberValueProvider方法,返回上面这个provider对象即可。

 

PS:对于datatable这种对象,自己实现一个Converter,在返回值的地方做手脚即可。这个源码不在这个电脑上,不贴了。 

 

(2)源码下载

 https://files.cnblogs.com/files/lijianzhq/TestJSON.zip

控制台测试程序。

posted @ 2018-02-02 19:44  lijianzhq  阅读(700)  评论(0)    收藏  举报