我尝试使用Newtonsoft Json.Net序列化对象。
这个对象是一个匿名类型,填充了很多异类内容,主要是常规POCO,还有一些JObject
或JArray
s。
问题在于,将NullValueHandling
属性添加到NullValueHandling.Ignore
时,每个null属性都会被忽略,但前提是它是"常规"的一部分。 .Net对象。 JObject
或JArray
中的每个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>
答案 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容器时返回JObject
在jsonString
中是一个JSON对象。)
答案 1 :(得分:0)
在您的字段名称上方添加 JsonProperty 装饰器:
<块引用> [JsonProperty("bookmark", NullValueHandling = NullValueHandling.Ignore)]
public string Bookmark { get; set; }