[] 是在 json 结果中表示空值的有效方法吗?

Posted

技术标签:

【中文标题】[] 是在 json 结果中表示空值的有效方法吗?【英文标题】:Is [] a valid way to represent a null value in a json result? 【发布时间】:2012-10-07 01:42:46 【问题描述】:

我正在尝试使用第 3 方 JSON API,并且预计 null 值将根本没有提供任何值、被排除在结果之外或某些默认值。相反,如果值不存在,API 会返回 [] 代替单个值(不是数组):

"SomeExpectedDate": [],
"SomeExpectedString": [],
...

当我尝试使用 JayRock JsonConvert 对其进行反序列化时,它失败了,因为我试图加载到单个 String 或 DateTime 值中。

这正常吗,还是我应该去投诉API提供者(这是最近推出的API)

【问题讨论】:

为什么不直接使用null? BTW [] 代表一个空数组而不是一个空值。 这是我为 Qt 的 JSON 解析器所做的。不是很优雅,理论上 [] 是一个合法的 JSON 字符串,所以有一些歧义,但有些语言没有 NULL 对象,并且其中一些相同的语言不能容忍 null 在它们的值字典对象。 (请注意,JSON 字符串中 null 的正确值是字符“null”,不带任何引号。) 但请注意,API 提供者可以将 API 生成的 JSON 字符串指定为任何合法的 JSON,而"SomeExpectedString": [] 是合法的 JSON。 嗯,它比 null 少了两个字符,但如果这就是它的本意,这是一个非常值得怀疑的优化。 @nneonneo -- 不是“优化”,更多的是对没有自然表示空对象的环境的“适应”。 【参考方案1】:

一般来说,不会。在 JSON 中,[] 表示一个空数组。如果要表示空值,请使用null 关键字。喜欢:

"someString": null

虽然就您希望如何在 JSON 中表示空值而言,这完全取决于您。如果您编写接收代码,以便它了解空数组等效于 null,那肯定会起作用。

然而,在我看来,这将是一种非常有问题/不可靠/难以维护的方法。使用 null 关键字更有意义,否则使用空字符串 ("someString": "")。

编辑:

为了回应您关于此问题与使用第三方 API 相关的更新,我认为这绝对是 API 提供商处理的问题。如果他们真正的意思是null,他们不应该返回[]。虽然他们发送的内容在技术上仍然是有效的 JSON,但他们使用 [] 而不是 null 在语义上是有问题的。

【讨论】:

有道理。我已经联系了 API 提供商,看看这是故意的还是错误的。谢谢!【参考方案2】:

如果您使用的第三方 API 显示空数组为 null,那么这是完全有效的,您需要围绕它编写代码。

它肯定和我以前见过的任何东西都不一样,因为 json 有一个实际的 null 关键字,但它是完全合法的语法。

【讨论】:

所讨论的值不是一个数组,而是一个单一的值(字符串、日期时间等),如果它为“null”,则返回为 []。 @JesseP - 但重点是,仅仅因为您期望单个值不会使空数组无效。它是合法的 JSON,API 提供者可以任意定义他的 API。 但是 [] 不是代表应该具有多个值的东西吗?如果它是 [] 或例如单个字符串,则 c# 中所有开箱即用的反序列化(我知道)都无法处理它。 API提供者将空值视为数组,他们也应该将单个值作为1元素数组,对吧? @JesseP -- 这意味着他们所说的任何意思。你可以向 API 人员投诉,但他们有最后的发言权—— JSON 规范没有指定什么是 MEAN。 (但在您开始使用 API 提供程序之前,请确保您看到的是原始源字符串,而不是您解析它的方式的产物。) @JesseP JSON 规范允许任何键的任何值。任何地方都没有限制说值必须具有特定类型。任何此类限制都是由设计 API 的人定义的,如果他们决定有时应该使用空数组,那么这就是他们决定的并且是最终决定。你可以问他们为什么,这对我来说似乎是一个奇怪的选择,但最终这是浪费时间,因为他们不太可能改变它。

以上是关于[] 是在 json 结果中表示空值的有效方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

pandas中表的合并与空值的使用

尝试显示从服务器对象检索到的值时显示空值

在pyspark中将值随机更改为空值的最有效方法是啥?

空字符串或空变量的 JSON 标准是啥?

如何在java中的内存中表示null [duplicate]

计算Spark DataFrame中的非空值的数量