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

时间:2015-03-25 14:32:38

标签: c# json json.net

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

这个对象是一个匿名类型,填充了很多异类内容,主要是常规POCO,还有一些JObjectJArray s。

问题在于,将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});

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

2 个答案:

答案 0 :(得分:17)

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

  "source2": {
    "z": null
  }

  "source2": {
  }

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

为了防止空标记进入JObject的值,请在从某个POCO创建JObject时使用相应的序列化设置:

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

(请注意,POCO本身必须不是JObject。无效的方法JsonConvert.DeserializeObject(jsonString)JsonConvert.DeserializeObject<dynamic>(jsonString)默认情况下会在根JSON容器时返回JObjectjsonString中是一个JSON对象。)

答案 1 :(得分:0)

在您的字段名称上方添加 JsonProperty 装饰器:

<块引用>
    [JsonProperty("bookmark", NullValueHandling = NullValueHandling.Ignore)]
    public string Bookmark { get; set; }