为什么JSON结果可以是布尔值而不是对象或数组?

9 浏览
0 Comments

为什么JSON结果可以是布尔值而不是对象或数组?

JSON网站:\n

\nJSON建立在两个结构之上:\n

    \n

  • 名称/值对的集合。在各种语言中,这可以实现为对象、记录、结构、字典、哈希表、键-值列表或关联数组。
  • \n

  • 有序值的列表。在大多数语言中,这可以实现为数组、向量、列表或序列。
  • \n

\n

\n现在我有一个返回布尔值的示例服务(这是在PHP中,但它可以是任何服务器端语言):\n


\n当使用ajax请求此页面(例如使用jQuery)时:\n

$.ajax({
    url: 'service.php',
    dataType: 'json',
    success: function (data) {
        console.log(data);
        console.log(typeof data);
    }
});

\n结果将是:\n

-> true
-> boolean

\n我的问题是为什么允许将boolean作为JSON返回。\n这是否与JSON的定义有冲突?\n


\n

还有

\n我也可以在我的服务中返回numberstring:\n


\n结果是:\n

-> 2013
-> number

\n以及字符串的情况:\n


\n结果是:\n

-> What is going on?
-> string

0
0 Comments

为什么JSON结果可以是布尔值而不是对象或数组?

根据RFC 8259,JSON文本是一个序列化的值。过去的JSON规范将JSON文本限制为对象或数组。但是,RFC 8259明确指出,只生成对象或数组的实现将是互操作的,因为所有实现都将接受它们作为符合JSON规范的文本。

RFC 8259还确认了JSON值可以是对象、数组、字符串、数字、true、false和null。

这证实了RFC已经发生了改变。通过查找stackoverflow上的一个问题,我们可以找到更多关于RFC的变化的信息。

因此,根据最新的RFC规范,JSON结果可以是布尔值,而不仅仅是对象或数组。

解决方法:根据RFC 8259的规范,如果需要生成JSON文本,只需生成一个布尔值即可。这将被所有实现接受为符合JSON规范的文本。

0
0 Comments

为什么JSON结果可能是布尔值而不是对象或数组?

JSON(JavaScript Object Notation)是一种用于在不同系统之间交换数据的轻量级数据交换格式。根据JSON RFC规范,一个有效的JSON文本只能是对象或数组。然而,最初在json.org上列出的JSON语法并没有清楚地说明这一点。这就导致了混淆,许多JSON库可以创建和解析独立的字符串、数字、布尔值等(无效的)JSON,即使它们并不是真正的有效JSON。

一些JSON解析器更严格,只接受对象或数组作为有效的JSON文本。这在生成供他人使用的JSON时非常重要,因为在这种情况下,应当更加严格地遵循JSON标准。即使在自己的应用程序中,也建议遵循这一标准,因为这样做可以方便地添加其他信息,而不会破坏现有的客户端代码。

此外,JSON数组存在潜在的安全风险。在跨站请求伪造(CSRF)的情况下,浏览器本身会解析JSON,通过用户会话从跨域获取JSON并将其作为JavaScript执行。尽管使用JSON.parse()是安全的,但在使用eval()或Function构造函数解析JSON时存在安全风险。这种风险主要涉及到数据的隐私问题,因此最好不要将JSON数组作为根数据返回,而是使用一个包含"items"键的对象。

为了遵循JSON标准并确保数据安全,建议在生成和解析JSON时遵循以下准则:

1. 一个有效的JSON文本应该是一个对象或数组。

2. 在自己的应用程序中,尽量使用对象作为顶级结构,以便后续添加更多信息。

3. 避免返回JSON数组作为根数据,而是使用一个包含"items"键的对象。

4. 在处理JSON时,使用可靠的JSON库,遵循最新的JSON规范。

这样做可以确保生成的JSON符合标准,并提高数据安全性。

0