Newtonsoft Json.Net序列化JObject不会忽略空值,即使使用正确的设置也是如此

我正在尝试使用Newtonsoft Json.Net序列化对象。

这个对象是一个匿名类型,填充了很多异类的东西,主要是普通的POCO,还有一些JObjectJArray

问题是,当将NullValueHandling属性添加到NullValueHandling.Ignore ,每个null属性都会被忽略,但NullValueHandling.Ignore是它只是“常规”.Net对象的一部分。 JObjectJArray每个null属性JArray保留。

这是一个最小的例子:

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

是否有一种简单的方法可以忽略这些空值? 我错过了一些设置选项吗? 或者我必须手动处理它?

JObject "null"值实际上是一个非null的JValue ,其JValue.Type等于JTokenType.Null 。 当这样的值实际出现在JSON中时,它表示JSON值为null。 我相信它可以捕获以下两个JSON对象之间的区别:

  "source2": { "z": null } "source2": { } 

在第一种情况下,属性"z"null JSON值存在。 在第二种情况下,属性"z"不存在。 Linq-to-JSON表示第一个具有null类型JValue情况,而不是让JProperty.Value实际为null

要防止空标记JObject您的JObject的值,请在创建JObject时使用相应的序列化程序设置:

  var jobj = JObject.FromObject(new { x = 1, y = "bla", z = (int?)null }, new JsonSerializer { NullValueHandling = NullValueHandling.Ignore } );