25

我想给出一个简单的true响应,但是根据各种 JSON 解析器,这不是有效的 JSON:

true

然而,PHP 和 Javascript 在编码和解码时都表现得像 "true" 确实是有效的 JSON true

PHP-

echo json_encode( true ); // outputs: true
echo json_decode( true ); // outputs: 1
echo gettype(json_decode( true )); // outputs: boolean

jQuery-

JSON.stringify( true );   // outputs: true
jQuery.parseJSON( true ); // outputs: true
typeof jQuery.parseJSON( true ); // outputs: boolean

那么发送true格式为 JSON 的响应的正确方法是什么?验证者都错了吗?

4

1 回答 1

25

来自RFC

JSON 文本是一个序列化的对象或数组。

  JSON-text = object / array

大多数解析器不接受任何不是对象或数组的根。只有不太严格的解析器才会接受您的 JSON 字符串只包含true.

所以你的选择是

  • 不使用 JSON
  • 将您的布​​尔值包装在一个对象中:{"result":true}或数组:[true]

更新:

情况发生了变化。较新版本的 JSON 规范(参见这个)明确接受任何序列化值作为文档的根:

JSON 文本是一个序列化的值。请注意,某些先前的 JSON 规范将 JSON 文本限制为对象或数组。仅生成需要 JSON 文本的对象或数组的实现将是可互操作的,因为所有实现都将接受这些作为符合标准的 JSON 文本。

这意味着现在使用布尔值作为唯一值在法律上是可以接受的。但当然,并非所有使用中的库都已更新,这意味着使用对象或数组以外的任何东西可能仍然存在问题。

于 2013-10-17T19:52:59.760 回答