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

时间:2017-10-31 03:22:23

标签: c# json null json.net null-string

在下面的代码行中,当string x值为clInitializer.AVOptions = null时,我的string x = JsonConvert.SerializeObject(clInitializer.AVOptions, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore}); 最终成为实际字符串“null”:

null

与实际单词“null”相同,而不是{}值或JsonConvert。我不确定这是预期的行为。有谁知道怎么让它不返回“null”这个词,或者我对{{1}}的工作方式有一些基本的误解。提前谢谢。

3 个答案:

答案 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 tr​​ue

     

文字名称必须小写。没有其他文字名称   允许的。

     

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”值。