我正在尝试使用NewtonsoftJson序列化一个对象。网
这个对象是一个匿名类型,里面充满了很多异构的东西,主要是常规的POCO,也有一些JObject
s或JArray
s。
问题是,当将NullValueHandling
属性添加到NullValueHandling.Ignore
时,每个null属性都会被忽略,但前提是它是"正则"的一部分。Net对象。JObject
或JArray
中的每个null属性都保留。
这里有一个最小的例子:
var jobj = JObject.FromObject(new Anything{
x = 1,
y = "bla",
z = null
});
var poco = new Foo {
foo1 = "bar",
foo2 = null
};
var serialized = JsonConvert.SerializeObject(new {
source1 = poco,
source2 = jobj
}, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});
有没有一种简单的方法可以忽略那些null值?我错过了一些设置选项吗?还是必须手动处理?
JObject
中的"null"
值实际上是JValue.Type
等于JTokenType.Null
的非空JValue
。当JSON中实际出现null值时,它表示该值。我相信它的存在是为了捕捉以下两个JSON对象之间的差异:
"source2": {
"z": null
}
"source2": {
}
在第一种情况下,属性"z"
带有null
JSON值。在第二种情况下,不存在属性"z"
。Linq到JSON表示第一种情况,其类型为null JValue
,而不是JProperty.Value
实际上为null。
为了防止空令牌悄悄进入JObject
的值,在从一些POCO:创建JObject
时使用适当的序列化程序设置
var jobj = JObject.FromObject(new
{
x = 1,
y = "bla",
z = (int?)null
}, new JsonSerializer { NullValueHandling = NullValueHandling.Ignore } );
(请注意,POCO本身不能是JObject
。当jsonString
中的根JSON容器是JSON对象时,非类型化方法JsonConvert.DeserializeObject(jsonString)
或JsonConvert.DeserializeObject<dynamic>(jsonString)
默认会返回JObject
。)
在字段名上方添加JsonProperty装饰器:
[JsonProperty("bookmark", NullValueHandling = NullValueHandling.Ignore)] public string Bookmark { get; set; }