gpt4 book ai didi

javascript - 为什么 JSON 结果可以是 bool 值而不是对象或数组?

转载 作者:数据小太阳 更新时间:2023-10-29 06:07:12 24 4
gpt4 key购买 nike

来自 JSON website :

JSON is built on two structures:

  • A collection of name/value pairs. In various languages, this is realized as an object, record, struct, dictionary, hash table, keyed list, or associative array.
  • An ordered list of values. In most languages, this is realized as an array, vector, list, or sequence.

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

<?php
header('Content-Type: application/json');
echo 'true';
exit;

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

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

结果是:

-> true
-> boolean

我的问题是为什么允许将 boolean 作为 JSON 返回。不会和JSON定义冲突吗?


还有

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

<?php
header('Content-Type: application/json');
echo '2013';
exit;

结果是:

-> 2013
-> number

对于字符串:

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

结果是:

-> What is going on?
-> string

最佳答案

您是正确的,有效的 JSON 文本只能是对象或数组。我在 2009 年就此问题询问了道格拉斯·克罗克福德,他证实了这一点,并说“严格来说,它是对象|数组,就像在 RFC 中一样。”

JSON RFC在第 2 节中指定:

A JSON text is a serialized object or array.

JSON-text = object / array

json.org 中列出的原始 JSON 语法根本没有说清楚。它定义了所有 JSON 类型,但没有说明这些类型中的哪些类型可以用作“JSON 文本”——完整有效的 JSON 片段。

这就是为什么我向 Doug 询问了这件事,他让我引用了 RFC。不幸的是,他没有按照我的建议更新 json.org 来澄清这一点。

可能由于这种混淆,许多 JSON 库将愉快地为独立的字符串、数字、 bool 值等创建和解析(无效的)JSON,即使它们不是真正有效的 JSON。

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

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

但是,如果您曾经生成 JSON 供其他人使用,则这一点很重要。在那里你应该更严格地遵循标准。

我建议即使在您自己的应用程序中也遵循它,部分原因是它有一个实际好处:通过发送一个对象而不是一个裸字符串,您有一个内置的地方可以在需要时添加更多信息,在对象中附加属性的形式。

按照这些思路,当我定义 JSON API 时,我从不在最顶层使用数组。如果我拥有的是某种项目的数组,我仍然将其包装在一个对象中:

{
"items": [
...
]
}

这在一定程度上是出于同样的原因:如果我以后想向响应中添加其他内容,将顶层作为对象可以很容易地做到这一点,而不会破坏任何现有的客户端代码。

也许更重要的是,还有一个可能的 security risk with JSON arrays . (我认为风险只会影响eval()Function 构造函数解析 JSON 的使用,所以使用 JSON.parse(),但我对此不是 100% 确定。)

关于javascript - 为什么 JSON 结果可以是 bool 值而不是对象或数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16955215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com