web-dev-qa-db-fra.com

Quelle est la bonne façon de formater "vrai" en JSON?

Je veux donner une réponse simple true, mais selon divers JSON analyseurs =, c'est pas JSON valide:

true

Cependant, PHP et Javascript agissent comme "true" est en effet un JSON valide pour true, à la fois lors de l'encodage et lors du décodage:

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

Alors, quelle est la bonne façon d'envoyer une réponse true au format JSON? Les validateurs ont-ils tous tort?

21
brentonstrine

De le RFC :

Un texte JSON est un objet ou un tableau sérialisé.

  JSON-text = object / array

La plupart des analyseurs n'acceptent rien en tant que root qui ne soit pas un objet ou un tableau. Seuls les analyseurs moins stricts accepteront que votre chaîne JSON ne contienne que true.

Vos options sont donc

  • ne pas utiliser JSON
  • pour envelopper votre booléen dans un objet: {"result":true} ou un tableau: [true]

Mise à jour:

La situation a changé. Les versions plus récentes de la spécification JSON (voir celle-ci ) acceptent explicitement toute valeur sérialisée en tant que racine d'un document:

Un texte JSON est une valeur sérialisée. Notez que certaines spécifications précédentes de JSON contraignaient un texte JSON à être un objet ou un tableau. Les implémentations qui génèrent uniquement des objets ou des tableaux où un texte JSON est demandé seront interopérables dans le sens où toutes les implémentations les accepteront comme des textes JSON conformes.

Cela signifie qu'il est désormais légalement acceptable d'utiliser un booléen comme valeur unique. Mais bien sûr, toutes les bibliothèques utilisées ne sont pas mises à jour, ce qui implique d'utiliser autre chose qu'un objet ou un tableau peut toujours être problématique.

20
Denys Séguret