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

xle*_*ier 9 c# json json.net

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

这个对象是一个匿名类型,充满了很多异类的东西,主要是普通的POCO,还有一些JObjects或JArrays.

问题是,在添加NullValueHandling属性时NullValueHandling.Ignore,每个null属性都会被忽略,但前提是它只是"常规".Net对象的一部分.内部JObjectJArray遗留的每个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});
Run Code Online (Sandbox Code Playgroud)

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

dbc*_*dbc 21

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

  "source2": {
    "z": null
  }

  "source2": {
  }
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,该属性"z"具有nullJSON值.在第二种情况下,该财产"z"不存在.Linq-to-JSON表示第一种具有null-type的情况,JValue而不是JProperty.Value实际为null.

要防止空令牌进入您JObject的值,请在JObject从某些POCO 创建时使用相应的序列化程序设置:

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

(注意,POCO本身不能是a JObject.无类型方法JsonConvert.DeserializeObject(jsonString)JsonConvert.DeserializeObject<dynamic>(jsonString)默认情况下将返回JObject当根JSON容器jsonString为JSON对象时.)