在使用JSON.NET序列化任意数据时,任何null属性都会被写入JSON中:
"propertyName" : null
这当然是正确的。
但是我有一个要求,即将所有null自动转换为默认的空值。例如,null的字符串应该变成String.Empty
,null的 int?
应该变成0
,null的bool?
应该变为false
等等。
NullValueHandling
不太有用,因为我既不想忽略null,也不想包含它们(嗯,这是个新特性吗?)。
所以我转而实现了一个自定义的JsonConverter
。虽然实现本身很容易,但不幸的是,这仍然不起作用——对于具有null值的属性,CanConvert()
从未被调用,因此WriteJson()
也不会被调用。显然,null会被自动直接序列化为null,而不经过自定义管道。
例如,以下是一个处理null字符串的自定义转换器示例:
public class StringConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(string).IsAssignableFrom(objectType);
}
...
public override void WriteJson(JsonWriter writer,
object value,
JsonSerializer serializer)
{
string strValue = value as string;
if (strValue == null)
{
writer.WriteValue(String.Empty);
}
else
{
writer.WriteValue(strValue);
}
}
}
在调试器中逐步执行代码时,我注意到对于具有null值的属性,这两种方法都不会被调用。
深入研究了JSON.NET的源代码后(显然,我没有深入研究)发现了一个特殊情况的检查,它明确调用.WriteNull()
。
值得一提的是,我尝试实现了一个自定义的JsonTextWriter
并覆盖了默认的.WriteNull()
方法的实现...
public class NullJsonWriter : JsonTextWriter
{
...
public override void WriteNull()
{
this.WriteValue(String.Empty);
}
}
然而,这种方法效果不佳,因为WriteNull()
方法对底层数据类型一无所知。因此,当出现 null 的时候,我可以输出 ""
,但是对于例如int、bool等类型来说就不太适用了。那么我的问题是:除非手动转换整个数据结构,否则是否存在任何解决方案或解决方法?
if(value==null)
这基本上是第一种情况 :( - J. HolmesJsonConverter<T>.HandleNull
现在可以让自定义转换器处理 null... ♀️ - AviD