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

17 浏览
0 Comments

在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中的空对象/列表是否有约定?数字、布尔值和字符串又如何呢?

0
0 Comments

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,从而降低了传输的成本。

0
0 Comments

在JSON中,有一个问题需要解决,那就是如何区分空值和未设置的值。有人认为我们应该区分这两种情况:

  • "phone" : "" = 值为空
  • "phone" : null = "phone"的值尚未设置
  • 如果我们想要区分这两种情况,那么我会使用null来表示未设置的值。否则,我们需要添加一个新的字段,比如"isAssigned"之类的。这是一个旧的数据库问题。

    为了区分已分配和未分配的值,我们还可以使用"phone"字段本身的存在/不存在来区分。这在处理Web API响应时尤其有用,可以通过仅发送必要的数据来减少流量。这种方法的可行性取决于Web API响应中此类字段的数量。

    0
    0 Comments

    JSON中的约定是如何处理空值和null值的问题?

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

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

    这里是我参考的来源。

    你引用的来源展示了如何同时使用null和空对象/数组。也许我没有正确阅读,但它似乎没有建议其中一个优于另一个。它也没有涉及JavaScript对JSON的消费如何影响选择。

    那空字符串呢?我们一直在遇到JSON将空字符串(长度为零的字符串)视为null(空字段)的问题。

    0