【问题标题】:What is the convention in JSON for empty vs. null?JSON 中空与空的约定是什么?
【发布时间】:2012-03-26 01:34:13
【问题描述】:

我知道在大多数编程场景中,当有 0 个元素时,首选是空集合而不是空集合。但是,大多数使用 JSON 的语言(如 JavaScript)会将空列表/对象视为真,将空列表/对象视为假。例如,这在 JavaScript 中既是 true 也是对象:

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

但这也是真的:

{
    "items_in_stock": {}
}

这是错误的:

{
    "items_in_stock": null
}

对于 JSON 的空对象/列表是否有约定?那么数字、布尔值和字符串呢?

【问题讨论】:

  • 此处未回答相关问题:JSON 如何处理空字符串。此外,非字符串对象的零长度字符串是否会被视为空值?

标签: javascript json


【解决方案1】:

如果预期的返回类型是数组,则返回一个空数组[] 是一种很好的编程习惯。这确保了 json 的接收者可以立即将值视为一个数组,而无需首先检查 null。使用开闭大括号 {} 的空对象也是如此。

字符串、布尔值和整数没有“空”形式,因此可以使用空值。

Joshua Blochs 的优秀著作《Effective Java》也提到了这一点。他在那里描述了一些非常好的通用编程实践(通常也适用于其他编程语言)。返回空集合而不是 null 就是其中之一。

这是他书中那部分的链接:

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

【讨论】:

  • 在 JavaScript 中你会检查 if (items_in_stock == null) 还是检查 if (items_in_stock)? JavaScript 开发人员是否不喜欢使用该语言的“真/假”特性?
  • 大多数人经常使用它。我个人尽量避免使用真/假代码,尽管它确实有它的好处(更少的代码)。它可能导致难以跟踪错误。例如:许多人为他们的函数参数设置默认值,如下所示: function func(a) { a = a || ''; ... }。当 a 未定义、null、0、-1、''、false 或 NaN 时,它将获得值 '',这可能是也可能不是您想要的(大多数情况下,您只想要 undefined 或 null) .这可能会导致奇怪的行为。很多人使用它是因为它很方便。
  • 我认为您没有任何文档链接来支持它?我试图说服 API 开发人员相信同样的事情,但这是一场艰苦的战斗。
  • 允许使用空字符串 "":json.org 很明显,语法图显示了从引出引号到结束引号的无路径。
  • @MariuszJamro,你能举个例子,让你觉得返回 null 而不是空数组更有意义吗?每次我尝试想象这样的场景时,我都认真地问,我看不出一个空数组如何无法重复同样的事情。
【解决方案2】:

有一个问题是我们是否要区分不同的情况:

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

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

如果我们想要区分,我会为此使用 null。否则,我们将需要添加一个新字段,例如“isAssigned”左右。这是一个旧的数据库问题。

【讨论】:

  • 为了区分分配的/未分配的值,我们还可以使用“电话”字段本身的存在/不存在,例如,Web API 响应,其中仅发送必要的数据如果目标是最小化流量,则可以使用。这种方法的敏感性取决于 Web API 响应中此类字段的数量。
【解决方案3】:

空集合表示空集合,null 表示其他所有集合。

【讨论】:

    【解决方案4】:

    “JSON 有一个特殊的值叫做 null,它可以设置在任何类型的数据上,包括数组、对象、数字和布尔类型。”

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

    Here 是我的来源。

    【讨论】:

    • 您引用的源代码显示了如何同时使用空值和空对象/数组。也许我没有正确阅读它,但它似乎并没有暗示另一个。并且它没有解决 JSON 的 JavaScript 消费如何影响选择。
    • 空字符串呢。我们已经看到 JSON 将空字符串(零长度字符串)视为 null(空字段)的问题。
    猜你喜欢
    • 2011-01-14
    • 2015-12-07
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2018-02-03
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多