2012-06-12 141 views
83

我正在創建一個將結果作爲JSON返回的API。當值爲null時,是否應該在結果中包含鍵?是否有最佳做法?例如:JSON是否包含空值

{ 
    "title":"Foo Bar", 
    "author":"Joe Blow", 
    "isbn":null 
} 

{ 
    "title":"Foo Bar", 
    "author":"Joe Blow" 
} 

由於第二是小我傾向於這種風格,但我不知道是否有一個首選的樣式或沒有。從客戶角度來看,這兩種款式在功能上都是相同的。任何對每個人的利弊?

+5

這是不可能的正確答案。正確答案取決於應用程序的要求。 OP已經簡單地選擇了適合他的要求的答案。如果您的應用程序需要區分是否知道「isbn」是否爲空,而如果由於其他原因可能沒有從服務器發送「isbn」,則需要包含它。 – Jacob

+0

@Jacob儘管我沒有這樣說,但我對這個問題的意圖是,表示響應的「完整」JSON正在返回。當客戶可以假設這兩種方法之間似乎沒有功能差異。如果API有選擇地不返回鍵/值,那麼是的,這會對採取哪種方法產生很大的影響。 – jjathman

+0

第一個表示法的好處是保留了對象模式,並且該數據的存在不會造成模糊。在第二種格式中,這些信息會丟失。 JSON規範並不要求格式AFAIK –

回答

30

第二個將節省帶寬量小,但如果這是一個問題,你也將使用,而不是與鍵填充JSON索引數組。顯然,["Foo Bar","Joe Blow"]比現在短得多。

就可用性而言,我不認爲它有任何區別。在這兩種情況下,if(json.isbn)將跳至else。通常不需要區分null(無值)和undefined(沒有給定值)。

+7

+1 for *通常不需要區分null(沒有值)和undefined(沒有給定的值)。*甚至有一個操作符'!= null'(非嚴格意圖) – Esailija

+0

唯一的案例我能想到如果瀏覽器支持某種事件類型,它會測試。例如,'if(typeof onbeforepaste ==「undefined」)'查看是否支持'onBeforePaste'。即使這樣,它也沒有什麼真正的區別,因爲你可以分配所有你想要的事件(如果不支持,他們就不會做任何事情)。 –

+0

在這種情況下,我會在文檔中測試''onbeforepaste'',以測試該屬性的存在。 – Esailija

19

在JavaScript中,null意味着什麼比undefined很大的不同。

您的JSON輸出應反映您的應用程序在使用JSON數據的特定上下文中所使用和需要的內容。

+4

JSON中沒有「未定義」,所以我認爲他只是詢問是否包含「空」屬性 - 「{」prop「:undefined}'與{ }'。 – Bergi

+0

同意,我試圖解釋,在接收端,如果他正在尋找一個特定的屬性設置爲null,它不會。如果沒有定義,它將會被忽略。 – Brad

10

如果您需要區分nullundefined,那麼您應該明確包含它,因爲這些在JavaScript中有兩個不同的含義。您可以將null視爲該屬性未知或無意義的含義,而undefined表示該屬性不存在。

另一方面,如果沒有人需要做出區分,那就繼續前進,然後離開。

71

我是一個總是包含null的粉絲,因爲它帶有含義。 雖然遺漏財產不明確。

只要與服務器的協議,在上述任何可以工作表示同意,但如果從服務器通過空我相信,讓你以後的API更加靈活。

還應該提及的是,javascript的hasOwnProperty函數可以讓您進一步瞭解。

/* if true object DOES contain the property with *some* value */ 
if(objectFromJSON.hasOwnProperty("propertyName")) 

/* if true object DOES contain the property and it has been set to null */ 
if(jsonObject.propertyName === null) 

/* if true object either DOES NOT contain the property 
    OR 
    object DOES contain the property and it has been set to undefined */ 
if(jsonObject.propertyName === undefined) 
+3

確切地說,更多的人需要了解「」,null和undefined之間的區別。這個問題的答案取決於用戶的需求。 – Jacob

+11

+1。另一端(編寫代碼的人)將通過明確的值得到更好的服務。他們可能不會寫JavaScript ;-) – Steve11235

+2

請注意,檢查null不適用於==,===是必需的(因爲undefined == null)! – Tommy

0

我認爲使用JSON作爲用戶體驗背後的數據沒有區別。

當用戶需要手動編輯某些內容時,JSON配置文件中會出現差異。當您使用第一個示例時,您會向用戶提供有關配置的一些提示。

+1

請您詳細說明您的答案,並添加關於您提供的解決方案的更多描述。 – abarisone