在JSON中格式化"true"的正确方法是什么?

bre*_*ine 22 json stringify

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

true
Run Code Online (Sandbox Code Playgroud)

但是,true在编码和解码时,PHP和Javascript的行为类似于"true"确实是有效的JSON :

PHP的

echo json_encode( true ); // outputs: true
echo json_decode( true ); // outputs: 1
echo gettype(json_decode( true )); // outputs: boolean
Run Code Online (Sandbox Code Playgroud)

jQuery-

JSON.stringify( true );   // outputs: true
jQuery.parseJSON( true ); // outputs: true
typeof jQuery.parseJSON( true ); // outputs: boolean
Run Code Online (Sandbox Code Playgroud)

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

Den*_*ret 20

来自RFC:

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

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

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

所以你的选择是

  • 不使用JSON
  • 将boolean包装在一个对象:{"result":true}或数组中:[true]

更新:

情况发生了变化.较新版本的JSON规范(请参阅规范)明确接受任何序列化值作为文档的根目录:

JSON文本是序列化值.请注意,某些先前的JSON规范将JSON文本约束为对象或数组.只生成调用JSON文本的对象或数组的实现将是可互操作的,因为所有实现都将接受这些作为符合JSON文本.

这意味着使用布尔值作为唯一值现在在法律上是可接受的.但是当然并非所有正在使用的库都会更新,这意味着使用除了对象或数组之外的任何其他库可能仍然存在问题.

  • 您正在使用的PHP代码是什么?如果你把它作为文字传递,你没有忘记引号? (2认同)