[] 是在 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 结果中表示空值的有效方法吗?的主要内容,如果未能解决你的问题,请参考以下文章