JsonConvert.SerializeObject:序列化null值时出现意外结果



在下面的代码行中,当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"值。

相关内容

  • 没有找到相关文章

最新更新