JSON应该包含空值

jja*_*man 86 javascript null json undefined

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

{
    "title":"Foo Bar",
    "author":"Joe Blow",
    "isbn":null
}
Run Code Online (Sandbox Code Playgroud)

要么

{
    "title":"Foo Bar",
    "author":"Joe Blow"
}
Run Code Online (Sandbox Code Playgroud)

由于第二个较小,我倾向于这种风格,但我不确定是否有一个首选的风格.从客户的角度来看,似乎两种风格在功能上都是等同的.各有利弊吗?

rus*_*don 77

我总是明确地包括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 )
Run Code Online (Sandbox Code Playgroud)

  • +1.另一端的人(编写代码的人)将通过显式值更好地服务.他们可能不会写JavaScript ;-) (13认同)
  • 确切地说,更多的人需要理解"",null和undefined之间的区别.这个问题的答案取决于用户的要求. (3认同)
  • 请注意,检查null不适用于==,===是必需的(因为undefined == null)! (2认同)

Nie*_*sol 31

第二个将节省一小部分带宽,但如果这是一个问题,你也可以使用索引数组,而不是用键填充JSON.显然,["Foo Bar","Joe Blow"]比你现在的要短得多.

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

  • +1 for*通常无需区分null(无值)和undefined(没有给定值).*甚至还有一个方便的运算符`!= null`(非严格意图) (7认同)
  • 在保存传输字节方面,压缩比索引数组更重要.http://web-resource-optimization.blogspot.no/2011/06/json-compression-algorithms.html确保这是你做的第一件事.在大多数情况下,在其上添加索引数组之类的东西就是我所说的过早优化.除非您发送大量数据.这还需要额外的解析,为您的应用添加更多复杂性.Gzipping由浏览器无缝完成.(假设客户端是浏览器) (6认同)
  • 如果我有声誉,我实际上-1这是因为"通常没有必要区分null".从2个原因:1.区分存在的理由存在并且并不罕见2.最佳实践是始终具有"明确定义"的值,这意味着始终防止任何歧义 - 1值的2个含义总是邪恶的 - 它应该非常清楚.. (6认同)
  • 随着HTTPS成为当时的常态(至少对于拥有大量用户群的应用程序而言),压缩需要折腾.见http://en.wikipedia.org/wiki/CRIME_%28security_exploit%29 (3认同)

Bra*_*rad 21

在JavaScript中,null意味着非常不同的东西undefined.

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

  • JSON中没有"未定义",所以我认为他只询问是否包含"空"属性 - "{"prop":undefined}`与`{}`不同. (5认同)

Pau*_*aul 11

如果有任何需要区分的话,你肯定应该包括它null,undefined因为它们在Javascript中有两个不同的含义.你可以认为null财产是未知的或无意义的,并且undefined意味着财产不存在.

另一方面,如果没有人需要做出这种区分,那就继续吧.