我正在尝试使用 Newtonsoft Json.Net 序列化对象.
I'm trying to serialize an object using Newtonsoft Json.Net.
这个对象是一个匿名类型,里面填充了很多异构的东西,主要是常规的POCO,也有一些JObjects或者JArrays.
This object is an anonymous type filled with a lot of heterogenous things, mainly regular POCOs, but also some JObjects or JArrays.
问题是,当将 NullValueHandling 属性添加到 NullValueHandling.Ignore 时,每个 null 属性都会被忽略,但前提是它是常规".Net 对象的一部分.JObject 或 JArray 中的每个 null 属性都会保留.
The thing is that when adding the NullValueHandling property to NullValueHandling.Ignore, every null property gets ignored, but only if it's part of a "regular" .Net object. Every null property inside a JObject or JArray remains.
这是一个最小的例子:
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});
是否有一种简单的方法也可以忽略这些空值?我错过了一些设置选项吗?还是我必须手动处理?
Is there a simple way to ignore those null values as well ? Did I miss some setting option ? Or do I have to deal with it manually ?
JObject中的"null"值实际上是一个非空JValue 与 JValue.Type代码> 等于 JTokenType.Null.当 JSON 中实际出现这样的值时,它表示 JSON 值 null.我相信它的存在是为了捕捉以下两个 JSON 对象之间的差异:
A "null" value in a JObject is actually a non-null JValue with JValue.Type equal to JTokenType.Null. It represents a JSON value of null when such a value actually appears in the JSON. I believe it exists to capture the difference between the following two JSON objects:
"source2": {
"z": null
}
"source2": {
}
在第一种情况下,属性 "z" 带有 null JSON 值.在第二种情况下,属性 "z" 不存在.Linq-to-JSON 表示第一个具有空类型 JValue 的情况,而不是 JProperty.Value 实际上 为空.
In the first case, the property "z" is present with a null JSON value. In the second case, the property "z" is not present. Linq-to-JSON represents the first case with a null-type JValue rather than having JProperty.Value actually be null.
为防止空标记进入您的 JObject 的值,请在从某些 POCO 创建 JObject 时使用适当的序列化程序设置:
To prevent null tokens from creeping into your JObject's values, use the appropriate serializer setting when creating the JObject from some POCO:
var jobj = JObject.FromObject(new
{
x = 1,
y = "bla",
z = (int?)null
}, new JsonSerializer { NullValueHandling = NullValueHandling.Ignore } );
(注意 POCO 本身不能是 JObject.无类型方法 JsonConvert.DeserializeObject(jsonString) 或 JsonConvert.DeserializeObject 在 jsonString 中的根 JSON 容器是 JSON 对象时默认返回 JObject.)
(Note the POCO must not itself already be a JObject. The untyped method(s) JsonConvert.DeserializeObject(jsonString) or JsonConvert.DeserializeObject<dynamic>(jsonString) will by default return a JObject when root JSON container in jsonString is a JSON object.)
这篇关于Newtonsoft Json.Net 序列化 JObject 不会忽略空值,即使设置正确的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!
读取 XML 时忽略空格Ignore whitespace while reading XML(读取 XML 时忽略空格)
带有检查空元素的 XML 到 LINQXML to LINQ with Checking Null Elements(带有检查空元素的 XML 到 LINQ)
在 C# 中读取带有未闭合标签的 XMLReading XML with unclosed tags in C#(在 C# 中读取带有未闭合标签的 XML)
在 C# 中使用 Html 敏捷性解析表格、单元格Parsing tables, cells with Html agility in C#(在 C# 中使用 Html 敏捷性解析表格、单元格)
使用 LINQ 从 xml 中删除元素delete element from xml using LINQ(使用 LINQ 从 xml 中删除元素)
解析格式错误的 XMLParse malformed XML(解析格式错误的 XML)