在JSON中,空值和null的约定是什么?
在JSON中,空值和null的约定是什么?
在大多数编程场景中,当元素数量为0时,首选空集合而不是空集合。然而,大多数消费JSON的语言(如JavaScript)会将空列表/对象视为true,将null列表/对象视为false。例如,在JavaScript中,以下内容既为true又为对象:
{
"items_in_stock": {"widgets":10, "gadgets": 5}
}
但以下内容也为true:
{
"items_in_stock": {}
}
而以下内容则为false:
{
"items_in_stock": null
}
JSON中的空对象/列表是否有约定?数字、布尔值和字符串又如何呢?
JSON中的约定是对于空值和null的表示方式。在返回类型为数组时,良好的编程实践是返回一个空数组[]
。这样可以确保接收JSON的人可以立即将该值视为数组,而无需先检查是否为null。对于空对象,也是使用开闭括号{}
的方式。
字符串、布尔值和整数没有“空”的形式,所以在这些情况下使用null值是可以的。
这也在Joshua Bloch的优秀书籍《Effective Java》中有所提及。在书中,他描述了一些非常好的通用编程实践(通常适用于其他编程语言)。返回空集合而不是null是其中之一。
这是他的书中的一部分链接:
http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html
在JavaScript中,你会检查(items_in_stock == null)还是检查(items_in_stock)?JavaScript开发者是否不喜欢使用该语言的“真值/假值”功能?
大多数人都经常使用它。个人而言,我尽量避免使用真值/假值代码,尽管它确实有其优点(代码更少)。它可能导致难以追踪的错误。例如:许多人像这样为函数参数设置默认值:function func(a) { a = a || ''; ... }。当a是undefined、null、0、-1、''、false或NaN时,它将获得''的值,这可能是你期望的,也可能不是(大多数情况下,你只想要undefined或null)。这可能导致奇怪的行为。然而,许多人使用它是因为它很方便。
我想知道你是否有任何支持这一观点的文档链接?我正在努力说服一个API开发者,但这是一场艰苦的战斗。
是的,在Joshua Blochs优秀书籍《Effective Java》中,他描述了一些非常好的通用编程实践。返回空集合而不是null是其中之一。这是他书中的一部分链接:jtechies.blogspot.nl/2012/07/…
空字符串""是允许的:json.org。明显的语法图显示了从引号开始到引号结束的路径。
在没有上下文的情况下,“使用空数组而不是null”是纯粹基于观点的。
你能给出一个例子,你认为返回null而不是空数组更合理吗?我是认真的,因为每次我试图想象这样的场景时,我都看不到空数组无法重复相同事物的情况。
Donohoe“缺乏证据并不是证据的缺乏”也适用于代码。例如:如果从缓存中获取,其中每个条目都是一个数组,那么null结果(未缓存)可能意味着与空数组结果(已缓存的空结果集)不同。也就是说,我同意null很少是一个好选择。在我的例子中,Optional<T>可能会更好,而且在野外确实有大量的代码不必要地将空作为一种特殊情况并返回null。
同意,并且关于缓存的观点很好,但我们在这里特别讨论的是JSON。也可以说,null意味着“保留已经存在的内容”。这也是另一个很好的用例。也就是说,我会更进一步...对于那些你确实希望null而不是空的情况,而不是在JSON中将属性设置为null,我会直接省略它。这等价于相同的效果(在解析器中配置时),并且还简化了JSON,从而降低了传输的成本。