Newtonsoft Json.Net 序列化 JObject 不会忽略空值,即使设置正确



我正在尝试使用NewtonsoftJson序列化一个对象。网

这个对象是一个匿名类型,里面充满了很多异构的东西,主要是常规的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});

有没有一种简单的方法可以忽略那些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; }

相关内容

  • 没有找到相关文章

最新更新