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

5 javascript ajax json

来自JSON网站:

JSON基于两种结构:

  • 名称/值对的集合.在各种语言中,这被实现为对象,记录,结构,字典,散列表,键控列表或关联数组.
  • 有序的值列表.在大多数语言中,这被实现为数组,向量,列表或序列.

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

<?php
header('Content-Type: application/json');
echo 'true';
exit;
Run Code Online (Sandbox Code Playgroud)

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

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

结果将是:

-> true
-> boolean
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么允许将布尔值作为JSON 返回.它与JSON定义有冲突吗?


我也可以在我的服务中返回数字字符串:

<?php
header('Content-Type: application/json');
echo '2013';
exit;
Run Code Online (Sandbox Code Playgroud)

结果是:

-> 2013
-> number
Run Code Online (Sandbox Code Playgroud)

对于字符串:

<?php
header('Content-Type: application/json');
echo '"What is going on?"';
exit;
Run Code Online (Sandbox Code Playgroud)

结果是:

-> What is going on?
-> string
Run Code Online (Sandbox Code Playgroud)

Mic*_*ary 7

您是正确的,有效的JSON文本只能是对象或数组.我在2009年向道格拉斯·克罗克福德询问了这个问题并且证实了这一点,他说:"严格来说,它就像RFC中的对象阵列一样."

JSON RFC指定了该第2:

JSON文本是序列化对象或数组.

JSON-text = object / array
Run Code Online (Sandbox Code Playgroud)

json.org上列出的原始JSON语法根本没有说清楚.它定义了所有JSON类型,但它没有说明哪些类型可以用作"JSON文本" - 一个完整有效的JSON.

这就是我向Doug询问的原因,他将我推荐给了RFC.不幸的是,他没有跟进我的建议,更新json.org以澄清这一点.

可能是因为这种混淆,许多JSON库会很乐意为独立字符串,数字,布尔值等创建和解析(无效)JSON,即使这些JSON不是真正有效的JSON.

一些JSON解析器更严格.例如,jsonlint.com拒绝JSON文本,如101,"abc",和true.它只接受一个对象或数组.

如果您只是在自己的Web应用程序中生成要使用的JSON数据,那么这种区别可能并不重要.毕竟,JSON.parse()很高兴解析它,这可能适用于所有浏览器.

但是,如果您为其他人生成JSON,那么这一点非常重要.在那里你应该更严格地遵循标准.

我建议甚至在你自己的应用程序中关注它,部分是因为它有一个实际的好处:通过发送一个对象而不是一个简单的字符串,你有一个内置的位置,如果你需要,可以添加更多的信息,以对象中的其他属性.

沿着这些方向,当我定义一个JSON API时,我从不在最顶层使用数组.如果我拥有的是某种类型的项目数组,我仍然将它包装在一个对象中:

{
    "items": [
        ...
    ]
}
Run Code Online (Sandbox Code Playgroud)

这部分是出于同样的原因:如果我以后想要在响应中添加其他内容,那么将顶层作为对象可以轻松完成,而不会中断任何现有的客户端代码.

也许更重要的是,JSON阵列也存在安全风险.(我认为风险只会影响使用eval()Function构造函数来解析JSON,所以你很安全JSON.parse(),但我对此并不是100%肯定.)