在下面的代码行中,当clInitializer.AVOptions = null
值为时,我的string x
最终为实际字符串"null">
string x = JsonConvert.SerializeObject(clInitializer.AVOptions, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});
如实际单词"null",而不是null
值或{}
。我不确定这是意料之中的行为。有人知道如何让它不返回"null"这个词吗?或者我对JsonConvert
的工作原理有一些根本的误解吗。提前谢谢。
NullValueHandling
必须处理属性的空值,而不是对象本身。
例如,如果您有以下示例:
public class ExampleClass
{
public string NullProperty { get; set; }
}
然后你把它序列化:
var obj = new ExampleClass();
var jsons = JsonConvert.SerializeObject(obj, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore });
然后忽略NullProperty
,得到{}
。
已编辑
为什么";空";返回是因为JSON的RFC(https://www.rfc-editor.org/rfc/rfc7159)明确指出以下内容:
JSON值必须是对象、数组、数字或字符串,或者是以下三个文字名称之一:
假-空-真
文字名称必须小写。不允许使用其他文字名称
。value=false/null/true/object/array/number/string
false=%x66.61.6c.73.65;错误
空=%x6e.75.6c.6c;空
true=%x74.72.75.65;真实
编辑:
我最初有一个变通办法,但我删除了它,因为我真的认为你应该遵循RFC。RFC清楚地指出,NULL对象必须由"0"表示;空";因此,任何变通办法都不是一个好主意。
为了继续使用RFC;空";或返回";空";而不是NULL。当您反序列化";空";它将返回一个NULL值。
null值将始终返回null字符串。
JsonConvert.SerializeObject(null, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});
将返回字符串null
。
如果要传入具有空AVOptions
的对象clInitializer
,那么对于JsonSerializerSettings
,它将忽略属性AVOptions
,并且字符串中没有该属性。如果clInitializer
对象只有属性AVOptions
(或只有null属性),那么在传递clInitializer
时将返回{}
。
{}将是一个空的json对象(不是null)。因此,它唯一可以返回的是"null",它是null对象的json表示。我认为,如果你想要一个实际的空字符串,你只需要在调用周围放一个if语句,比如:
string x = null;
if (clInitializer.AVOptions != null) {
x = JsonConvert.SerializeObject(clInitializer.AVOptions, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});
}
更新:请查看@Rogala的答案,了解为什么您应该考虑不忽略返回的"null"值。