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