25

true簡単な応答を返したいのですが、さまざまな JSON パーサーによると、これは有効な JSONではありません。

true

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

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}ブール値を object :または arrayにラップするには:[true]

アップデート:

状況が変わりました。JSON 仕様の新しいバージョン (こちらを参照)では、シリアル化された値をドキュメントのルートとして明示的に受け入れます。

JSON テキストはシリアライズされた値です。JSON の特定の以前の仕様では、JSON テキストがオブジェクトまたは配列になるように制約されていたことに注意してください。JSON テキストが必要なオブジェクトまたは配列のみを生成する実装は、すべての実装がこれらを準拠する JSON テキストとして受け入れるという意味で相互運用可能です。

これは、ブール値を一意の値として使用することが法的に許容されるようになったことを意味します。ただし、もちろん、使用中のすべてのライブラリが更新されるわけではありません。つまり、オブジェクトまたは配列以外のものを使用すると、問題が発生する可能性があります。

于 2013-10-17T19:52:59.760 に答える