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
控制台测试程序。

浙公网安备 33010602011771号