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 对象。 JObject
或 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"
值实际上是 非空 JValue
和 JValue.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 是 JObject
当 jsonString
中的根 JSON 容器是一个 JSON 对象。)
在您的字段名称上方添加 JsonProperty 装饰器:
[JsonProperty("bookmark", NullValueHandling = NullValueHandling.Ignore)]
public string Bookmark { get; set; }
我正在尝试使用 Newtonsoft Json.Net 序列化一个对象。
这个对象是一个匿名类型,填充了很多异构的东西,主要是常规的POCO,还有一些JObject
或者JArray
。
问题是,当将 NullValueHandling
属性 添加到 NullValueHandling.Ignore
时,每个空 属性 都会被忽略,但前提是它是 [=28= 的一部分] .Net 对象。 JObject
或 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"
值实际上是 非空 JValue
和 JValue.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 是 JObject
当 jsonString
中的根 JSON 容器是一个 JSON 对象。)
在您的字段名称上方添加 JsonProperty 装饰器:
[JsonProperty("bookmark", NullValueHandling = NullValueHandling.Ignore)] public string Bookmark { get; set; }