JSON是否应包含空值[关闭]


89

我正在创建一个将结果作为JSON返回的API。当前的最佳实践是,当值为null时是否应在结果中包括键吗?例如:

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

要么

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

由于第二个较小,因此我倾向于这种样式,但是我不确定是否有首选样式。从客户的角度看,这两种样式在功能上似乎是等效的。每个都有优点或缺点吗?


6
这是不可能正确回答的。正确答案取决于应用程序的要求。OP仅选择了适合他要求的答案。如果您的应用程序需要能够区分知道“ isbn”是否为空和是否由于其他原因未从服务器发送“ isbn”,则需要包括它。
杰伊,

@Jacob尽管我没有说出来,但我的意图是要返回表示响应的“完整” JSON。当客户可以认为这两种方法在功能上没有区别时。如果API有选择地不返回键/值,则可以,采用哪种方法将有很大的不同。
jjathman

第一种表示形式的好处是保留了对象模式,基于数据的属性的存在并不模糊。在第二种格式中,此信息丢失。JSON规范本身不强制使用两种格式的AFAIK
Surya Pratap,2016年

Answers:


32

第二个将节省少量带宽,但是如果您担心这一点,则还可以使用索引数组,而不用键填充JSON。显然,["Foo Bar","Joe Blow"]它比您现在拥有的要短得多。

在可用性方面,我认为这没有任何区别。在这两种情况下,if(json.isbn)都将跳到else。通常无需区分null(无值)和undefined(无给定值)。


7
对于+1,通常不需要区分null(无值)和undefined(无给定值)。甚至还有一个方便的运算符!= null(非严格限制)
Esailija 2012年

我能想到的唯一情况是测试浏览器是否支持某种事件类型。例如,if( typeof onbeforepaste == "undefined")查看是否onBeforePaste受支持。即使那样,它也没有任何实际区别,因为您可以分配所需的所有事件(如果不受支持,它们将不执行任何操作)。
Niet the Dark Absol 2012年

6
就保存传输的字节而言,压缩比索引数组之类的东西重要得多。web-resource-optimization.blogspot.no/2011/06/…确保这是您要做的第一件事。在大多数情况下,在上面添加诸如索引数组之类的东西就是我所说的过早优化。除非您要发送大量数据。这也需要额外的解析,从而增加了应用程序的复杂性。Gzip压缩是由浏览器无缝完成的。(假设客户端是浏览器)
Martin Hansen 2012年

3
随着HTTPS成为当今的规范(至少对于具有大量用户群的应用程序而言),压缩变得麻烦了。参见en.wikipedia.org/wiki/CRIME_%28security_exploit%29
Gaurav Vaish 2014年

6
如果我有声望,我实际上会为-1表示“通常不需要区分null”。有2个原因:1.区分存在的原因和不罕见的原因2.最佳做法是始终保持“定义明确”的值,这意味着始终防止任何歧义-1值的2个含义总是邪恶的-应该很清楚。
斯奈切克2015年

80

我喜欢始终明确包含null,因为它带有含义。尽管省略了属性,但仍会产生歧义。

只要您与服务器达成协议,上述任何一项都可以使用,但是如果您从服务器传递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之间的区别。该问题的答案取决于用户要求。
杰伊

13
+1。显式值可以更好地服务另一端的人(编写代码的人)。他们可能没有写JavaScript ;-)
Steve11235

2
请注意,对null进行检查不适用于==,因此===是必需的(因为undefined == null)!
汤米

正好接受的答案的第一部分是如此错误...
Srneczek 2015年

我会写"propertyName" in objectFromJSON而不是objectFromJSON.hasOwnProperty("propertyName")。此外,如果您坚持使用,请hasOwnProperty写出Object.prototype.hasOwnProperty.call(objectFromJSON, "propertyName")安全信息。
Aadit M Shah,

22

在JavaScript中,与的null含义非常不同undefined

JSON输出应反映应用程序在使用JSON数据的特定上下文中使用和需要的内容。


5
JSON中没有“未定义”,因此我认为他仅询问是否包含“空”属性-{"prop":undefined}与有所不同{}
Bergi 2012年

同意,我想解释一下,在接收端,如果他正在寻找要设置为null的特定属性,则不会。如果省略,它将是不确定的。
Brad 2012年

11

如果有必要区分它们,null并且undefined在Javascript中有两种不同的含义,则绝对应该包括它。您可以认为null该属性是未知的或无意义的,也可以认为undefined该属性不存在。

另一方面,如果不需要任何人做出这种区分,那就继续进行下去。


0

我认为当您将JSON用作用户体验背后的数据时,这没什么不同。

当用户应手动编辑某些内容时,差异会显示在JSON-config文件中。使用第一个示例时,您可以向用户提供有关配置的提示。


1
您能否详细说明您的答案,并提供有关您提供的解决方案的更多说明?
abarisone
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.