9

在下面的代码行中,string x当值时,我最终是一个实际的字符串“null” clInitializer.AVOptions = null

string x = JsonConvert.SerializeObject(clInitializer.AVOptions, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});

正如实际单词“null”而不是null值或也许{}。我不确定这是预期的行为。有谁知道如何让它不返回“null”这个词,或者我对它的JsonConvert工作原理有一些基本的误解。先感谢您。

4

3 回答 3

11

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”的原因是因为 JSON 的 RFC ( https://www.rfc-editor.org/rfc/rfc7159 ) 明确指出以下内容:

JSON 值必须是对象、数组、数字或字符串,或
以下三个文字名称之一:

假空真

文字名称必须是小写的。不允许使用其他文字名称

值=假/空/真/对象/数组/数字/字符串

错误 = %x66.61.6c.73.65 ;错误的

空=%x6e.75.6c.6c;无效的

真 = %x74.72.75.65 ;真的

编辑:

我最初有一个解决方法,但我删除了它,因为我真的认为你应该遵循 RFC。RFC 明确指出 NULL 对象必须由“null”表示,因此任何变通方法都不是一个好主意。

为了与 RFC 保持一致,我将存储“null”或返回“null”而不是 NULL。当您反序列化“null”时,它将返回一个 NULL 值。

于 2017-10-31T03:39:35.917 回答
3

null 值将始终返回空字符串。

JsonConvert.SerializeObject(null, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});

将返回字符串null

如果您要传入clInitializer具有 null 的对象,AVOptions那么您的JsonSerializerSettings它将忽略该属性AVOptions并且在字符串中没有该属性。如果您的clInitializer对象只有该属性AVOptions(或只有空属性),那么您将{}在传入时返回clInitializer.

于 2017-10-31T03:43:56.617 回答
-1

{} 将是一个空的 json 对象(不为空)。所以它唯一可以返回的是“null”,它是一个空对象的 json 表示。我认为如果你想要一个实际的空字符串,你只需要在调用周围放置一个 if 语句,如下所示:

    string x = null; 

    if (clInitializer.AVOptions != null) {
        x = JsonConvert.SerializeObject(clInitializer.AVOptions, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});
    }

更新:请参阅@Rogala 的回答,了解为什么您应该考虑不忽略返回的“null”值。

于 2017-10-31T03:48:54.903 回答