web-dev-qa-db-ja.com

JSONで「true」をフォーマットする正しい方法は何ですか?

単純なtrue応答を返したいが、 various[〜#〜] json [〜#〜]parsers に従って=、これはnot有効なJSON:

true

ただし、PHPであり、Javascriptが「true」のように振る舞うのは、エンコード時とデコード時の両方で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

JSONとしてフォーマットされたtrue応答を送信する正しい方法は何ですか?バリデーターはすべて間違っていますか?

21
brentonstrine

RFC から:

JSONテキストは、シリアル化されたオブジェクトまたは配列です。

  JSON-text = object / array

ほとんどのパーサーは、オブジェクトまたは配列ではないルートとして何も受け入れません。 JSON文字列にtrueのみが含まれることを受け入れるのは、厳密性の低いパーサーのみです。

あなたのオプションは

  • jSONを使用しない
  • ブール値をオブジェクトにラップするには:{"result":true}または配列:[true]

更新:

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

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

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

20
Denys Séguret