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

Newtonsoft Json.Net serialize JObject doesn't ignore nulls, even with the right settings

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

这个对象是一个匿名类型,填充了很多异构的东西,主要是常规的POCO,还有一些JObject或者JArray

问题是,当将 NullValueHandling 属性 添加到 NullValueHandling.Ignore 时,每个空 属性 都会被忽略,但前提是它是 [=28= 的一部分] .Net 对象。 JObjectJArray 中的每个空值 属性 都会保留。

这是一个最小的例子:

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" 值实际上是 非空 JValueJValue.Type equal to JTokenType.Null。当这样的值实际出现在 JSON 中时,它代表一个 JSON 值为 null 的值。我相信它的存在是为了捕捉以下两个 JSON 对象之间的差异:

  "source2": {
    "z": null
  }

  "source2": {
  }

在第一种情况下,属性 "z"null JSON 值一起出现。在第二种情况下, 属性 "z" 不存在。 Linq-to-JSON 表示第一个空类型 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。未类型化的方法 JsonConvert.DeserializeObject(jsonString)JsonConvert.DeserializeObject<dynamic>(jsonString) 默认情况下 return 是 JObjectjsonString 中的根 JSON 容器是一个 JSON 对象。)

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

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