JsonConvert.SerializeObject: 序列化空值时出现意外结果
JsonConvert.SerializeObject: Unexpected result when Serializing null value
在下面的代码行中,当 clInitializer.AVOptions = null
值:
时,我的 string x
最终成为一个实际的字符串 "null"
string x = JsonConvert.SerializeObject(clInitializer.AVOptions, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});
如实际单词 "null" 而不是 null
值或可能 {}
。我不确定这是预期的行为。有谁知道如何使它不是 return 这个词 "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
被忽略,你得到 {}
.
已编辑
“null”被 returned 的原因是因为 JSON (https://www.rfc-editor.org/rfc/rfc7159) 的 RFC 明确说明如下:
A JSON value MUST be an object, array, number, or string, or one of
the following three literal names:
false null true
The literal names MUST be lowercase. No other literal names are
allowed.
value = false / null / true / object / array / number / string
false = %x66.61.6c.73.65 ; false
null = %x6e.75.6c.6c ; null
true = %x74.72.75.65 ; true
已编辑:
我最初有一个解决方法,但我删除了它,因为我真的认为您应该遵循 RFC。 RFC 明确指出 NULL 对象必须由“null”表示,因此任何解决方法都不是一个好主意。
为了遵守 RFC,我将存储“null”或 return“null”而不是 NULL。当您反序列化“null”时,它将 return 一个 NULL 值。
空值将始终 return 空字符串。
JsonConvert.SerializeObject(null, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});
将return字符串null
。
如果您要传递具有空值 AVOptions
的对象 clInitializer
,那么您的 JsonSerializerSettings
将忽略 属性 AVOptions
并且字符串中没有那个。如果您的 clInitializer
对象只有 属性 AVOptions
(或只有空属性),那么您在传入 clInitializer
时会得到 {}
returned .
{} 将是一个空的 json 对象(不为空)。所以它唯一可以 return 的是 "null" ,这是空对象的 json 表示。我想如果你想要一个实际的空字符串,你只需要像这样在调用周围放置一个 if 语句:
string x = null;
if (clInitializer.AVOptions != null) {
x = JsonConvert.SerializeObject(clInitializer.AVOptions, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});
}
更新:请参阅@Rogala 的回答,了解为什么您应该考虑不忽略 returned "null" 值。
在下面的代码行中,当 clInitializer.AVOptions = null
值:
string x
最终成为一个实际的字符串 "null"
string x = JsonConvert.SerializeObject(clInitializer.AVOptions, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});
如实际单词 "null" 而不是 null
值或可能 {}
。我不确定这是预期的行为。有谁知道如何使它不是 return 这个词 "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
被忽略,你得到 {}
.
已编辑
“null”被 returned 的原因是因为 JSON (https://www.rfc-editor.org/rfc/rfc7159) 的 RFC 明确说明如下:
A JSON value MUST be an object, array, number, or string, or one of
the following three literal names:false null true
The literal names MUST be lowercase. No other literal names are
allowed.value = false / null / true / object / array / number / string
false = %x66.61.6c.73.65 ; false
null = %x6e.75.6c.6c ; null
true = %x74.72.75.65 ; true
已编辑:
我最初有一个解决方法,但我删除了它,因为我真的认为您应该遵循 RFC。 RFC 明确指出 NULL 对象必须由“null”表示,因此任何解决方法都不是一个好主意。
为了遵守 RFC,我将存储“null”或 return“null”而不是 NULL。当您反序列化“null”时,它将 return 一个 NULL 值。
空值将始终 return 空字符串。
JsonConvert.SerializeObject(null, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});
将return字符串null
。
如果您要传递具有空值 AVOptions
的对象 clInitializer
,那么您的 JsonSerializerSettings
将忽略 属性 AVOptions
并且字符串中没有那个。如果您的 clInitializer
对象只有 属性 AVOptions
(或只有空属性),那么您在传入 clInitializer
时会得到 {}
returned .
{} 将是一个空的 json 对象(不为空)。所以它唯一可以 return 的是 "null" ,这是空对象的 json 表示。我想如果你想要一个实际的空字符串,你只需要像这样在调用周围放置一个 if 语句:
string x = null;
if (clInitializer.AVOptions != null) {
x = JsonConvert.SerializeObject(clInitializer.AVOptions, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});
}
更新:请参阅@Rogala 的回答,了解为什么您应该考虑不忽略 returned "null" 值。