簡體   English   中英

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值或者可能是{} 我不確定這是預期的行為。 有誰知道如何讓它不返回“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”的原因是因為JSON的RFC( 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對象必須用“null”表示,所以任何解決方法都不是一個好主意。

為了保持RFC,我會存儲“null”或返回“null”而不是NULL。 反序列化“null”時,它將返回NULL值。

〜干杯

值null將始終返回空字符串。

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

將返回字符串null

如果你傳入具有空AVOptions的對象clInitializer然后使用你的JsonSerializerSettings它會忽略屬性AVOptions而不是字符串中的那個。 如果您clInitializer對象只有財產AVOptions (或只空的屬性),那么你會得到{}傳遞時返回clInitializer

{}將是一個空的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”值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM