Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# []是在json结果中表示空值的有效方法吗?_C#_.net_Json_Api_Jayrock - Fatal编程技术网

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

C# []是在json结果中表示空值的有效方法吗?,c#,.net,json,api,jayrock,C#,.net,Json,Api,Jayrock,我正在尝试使用第三方JSON API,预期空值将完全没有提供值、结果中没有提供值或某些默认值。相反,如果值不存在,API返回[]代替单个值(不是数组): "SomeExpectedDate": [], "SomeExpectedString": [], ... 当我尝试使用JayRock JsonConvert反序列化它时,它失败了,因为我试图加载到单个字符串或日期时间值中 这是正常的,还是应该向API提供程序投诉(这是最近推出的API)一般来说,否。在JSON[]中表示一个空数组。如果要表示

我正在尝试使用第三方JSON API,预期空值将完全没有提供值、结果中没有提供值或某些默认值。相反,如果值不存在,API返回[]代替单个值(不是数组):

"SomeExpectedDate": [],
"SomeExpectedString": [],
...
当我尝试使用JayRock JsonConvert反序列化它时,它失败了,因为我试图加载到单个字符串或日期时间值中


这是正常的,还是应该向API提供程序投诉(这是最近推出的API)

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

{"someString": null}
尽管就如何在JSON中表示空值而言,这完全取决于您自己。如果您编写接收代码以便它理解空数组等同于null,那么这肯定会起作用

然而,在我看来,这将是一个非常可疑/不可靠/难以维护的方法。使用
null
关键字,或者使用空字符串(
{“someString”:“}
)更有意义

编辑:


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

在语义上是有问题的。如果您使用的第三方API说空数组为null,那么这是完全有效的,您需要围绕它编写代码


它当然不同于我以前见过的任何东西,因为json有一个实际的
null
关键字,但它是完全合法的语法。

为什么不简单地使用
null
?顺便说一句,[]表示一个空数组,而不是空值。这是我为Qt的JSON解析器所做的。不是非常优雅,理论上,
[]
是一个合法的JSON字符串,因此存在一些歧义,但有些语言没有空对象,而且这些语言中的一些语言不能容忍字典对象中的
NULL
值。(请注意,JSON字符串中null的正确值是字符“null”,不带任何引号。)但请注意,API提供程序可以将API生成的JSON字符串指定为任何合法JSON,并且
“SomeExpectedString”:[]
是合法JSON。它比
null
少两个字符,但是,如果它的目的是这样的话,那么这是一个非常值得怀疑的优化。@nneonneo——不是一个“优化”,更多的是一个“适应”环境,它没有空对象的自然表示。这是有意义的。我已经联系了API提供商,看看这是故意的,还是一个bug。谢谢所讨论的值不是数组,而是单个值(字符串、日期时间等),如果其为“null”,则返回为[]。@JesseP-但关键是,仅仅因为您期望单个值不会使空数组无效。它是合法的JSON,API提供程序可以按任何方式定义自己的API。但是[]不是应该有多个值的东西的代表吗?如果它是[]或单个字符串,那么c#中所有开箱即用的反序列化(据我所知)都无法处理它。API providider将空值视为数组,他们也应该将单个值视为1元素数组,对吗?@JesseP——这意味着他们所说的一切。你可以向API的人抱怨,但他们有最后的发言权——JSON规范没有指定事情的含义。(但在你跳转到API提供程序之前,确保你看到的是原始源字符串,而不是你解析它的方式的产物。)@JesseP JSON规范允许任何键有任何值。任何地方都没有规定值必须具有特定类型的限制。任何这样的限制都是由设计API的人定义的,如果他们决定有时应该使用空数组,那么这就是他们的决定,也是最终决定。你可以问他们为什么,这对我来说似乎是一个奇怪的选择,但最终这是浪费时间,因为他们不太可能改变它。