在JSON中,空值和null的约定是什么?

91

我知道在大多数编程场景中,当元素为0时,空集合通常优先于null集合。但是,大多数消费JSON的语言(如JavaScript)将把空列表/对象视为true,而把null列表/对象视为false。例如,在JavaScript中,这将是一个真实的对象:

{
    "items_in_stock": {"widgets":10, "gadgets": 5}
}

但这也是正确的:

{
    "items_in_stock": {}
}

而这是错误的:

{
    "items_in_stock": null
}

在JSON中,空对象/列表是否有惯例?那么数字、布尔值和字符串呢?


1
相关:JSON应该包含null值吗 - Bergi
这里没有回答相关问题:JSON如何处理空字符串。此外,对于非字符串对象的零长度字符串是否被视为null? - tdugan
4个回答

91
如果期望的返回类型是数组,将空数组[]作为返回值是良好的编程实践。这样可以确保接收JSON的人可以立即将该值视为数组,而无需首先检查是否为空。同样的方式适用于使用开闭大括号{}的空对象。
字符串、布尔和整数没有“空”形式,因此在这些情况下使用null值是可以的。
这也在Joshua Bloch的优秀著作《Effective Java》中有所涉及。在书中,他描述了一些非常好的通用编程实践(通常也适用于其他编程语言之中)。返回空集合而不是null是其中之一。
以下是他书中相关部分的链接:

http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html


3
在 JavaScript 中,你会检查 (items_in_stock == null) 还是 (items_in_stock)?JavaScript 开发者是否喜欢使用语言的“真值/假值”特性? - rzrelyea
3
大多数人经常使用它。个人尽量避免使用 truthy / falsy 代码,尽管它确实有其优点(代码更少)。它可能导致难以跟踪的错误。例如:许多人像这样为其函数参数设置默认值: _function func(a) { a = a || ''; ... }_。当 a 为 undefined、null、0、-1、''、false 或 NaN 时,它将获得值 '',这可能是您想要的,也可能不是(通常只想要 undefined 或 null)。这可能会导致奇怪的行为。很多人还是使用它,因为它很方便。 - Koen Peters
1
我不确定你是否有任何文档链接来支持这一点?我正在试图说服一个API开发人员相信同样的事情,但这是一场苦战。 - MikeyWard
4
允许使用空字符串"":http://json.org/ 显然,语法图示显示了从引号开始到结束的“nothing path”。 - Wheezil
2
在没有上下文的情况下,“使用空数组而不是null”纯粹是基于个人意见的。 - Mariusz Jamro
显示剩余4条评论

12

"JSON有一个特殊的值叫做null,可以应用于任何类型的数据,包括数组、对象、数字和布尔类型。"

"JSON空概念适用于数组和对象...数据对象没有空列表的概念。因此,对于这些属性,数据对象不会采取任何操作。"

这里是我的信息来源。


2
您所引用的源代码展示了如何同时使用null和空对象/数组。也许我没有正确阅读,但它似乎并没有建议其中之一。而且它也没有解释JavaScript对JSON的消耗如何影响选择。 - rzrelyea
3
空字符串怎么处理?我们看到JSON将空字符串(长度为零的字符串)视为null(空字段)的问题。 - tdugan

6

问题是我们是否要区分这些情况:

  1. "phone" : "" = 值为空

  2. "phone" : null = "phone"的值尚未设置

如果我们想要区分,我建议使用null。否则,我们需要添加一个新字段,比如“isAssigned”。这是一个旧数据库问题。


4
为了区分已分配/未分配的值,我们可以使用“phone”字段本身的存在/不存在来确定,例如在Web API响应中,如果目标是最小化流量,那么只发送必要的数据即可。此方法的可行性取决于Web API响应中此类字段的数量。 - AlexDEV.pro

5

对于空集合使用空数组,对于其他情况使用null


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接