来自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)
您是正确的,有效的JSON文本只能是对象或数组.我在2009年向道格拉斯·克罗克福德询问了这个问题并且证实了这一点,他说:"严格来说,它就像RFC中的对象阵列一样."
的JSON RFC指定了该第2:
JSON文本是序列化对象或数组.
Run Code Online (Sandbox Code Playgroud)JSON-text = object / array
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%肯定.)
归档时间: |
|
查看次数: |
1364 次 |
最近记录: |