在下面的代码行中,当string x
值为clInitializer.AVOptions = null
时,我的string x = JsonConvert.SerializeObject(clInitializer.AVOptions, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});
最终成为实际字符串“null”:
null
与实际单词“null”相同,而不是{}
值或JsonConvert
。我不确定这是预期的行为。有谁知道怎么让它不返回“null”这个词,或者我对{{1}}的工作方式有一些基本的误解。提前谢谢。
答案 0 :(得分:6)
NullValueHandling
与属性的空值有关,而不是它自己的对象。
例如,如果您有以下示例:
public class ExampleClass
{
public string NullProperty { get; set; }
}
然后你序列化它:
var obj = new ExampleClass();
var jsons = JsonConvert.SerializeObject(obj, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore });
然后忽略NullProperty
并获得{}
。
<强>被修改强>
&#34; null&#34;返回是因为RFC for JSON(https://tools.ietf.org/html/rfc7159)明确指出以下内容:
JSON值必须是对象,数组,数字或字符串,或者是其中之一 以下三个字面名称:
false null true
文字名称必须小写。没有其他文字名称 允许的。
value = false / null / true / object / array / number / string
false =%x66.61.6c.73.65;假
null =%x6e.75.6c.6c;空
true =%x74.72.75.65;真
<强>编辑:强>
我最初有一个工作,但我删除了它,因为我真的认为你应该遵循RFC。 RFC清楚地声明NULL对象必须由&#34; null&#34;表示。所以任何解决方案都不是一个好主意。
要继续使用RFC,我会存储&#34; null&#34;或者返回&#34; null&#34;而不是NULL。当你反序列化&#34; null&#34;它将返回NULL值。
〜干杯
答案 1 :(得分:3)
值null将始终返回空字符串。
JsonConvert.SerializeObject(null, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});
将返回字符串null
。
如果您传入的对象clInitializer
具有空AVOptions
,然后传入JsonSerializerSettings
,则会忽略属性AVOptions
而不是字符串中的clInitializer
。如果您的AVOptions
对象只有属性{}
(或只有null属性),那么在传入clInitializer
时会返回.gitignore
。
答案 2 :(得分:-1)
{}将是一个空的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”值。