PHP: Comment encoder des nombres infinis ou NaN en JSON?
Apparemment, l'infini et NaN sont pas une partie de JSON spécification, de sorte que ce code PHP:
$numbers = array();
$numbers ['positive_infinity'] = +INF;
$numbers ['negative_infinity'] = -INF;
$numbers ['not_a_number'] = NAN;
$array_print = print_r ($numbers, true);
$array_json = json_encode ($numbers);
echo "\nprint_r(): $array_print";
echo "\njson_encode(): $array_json";
Ce produit:
PHP Warning: json_encode(): double INF does not conform to the JSON spec, encoded as 0 in /home/septi/test.php on line 8
PHP Warning: json_encode(): double -INF does not conform to the JSON spec, encoded as 0 in /home/septi/test.php on line 8
PHP Warning: json_encode(): double NAN does not conform to the JSON spec, encoded as 0 in /home/septi/test.php on line 8
print_r(): Array
(
[positive_infinity] => INF
[negative_infinity] => -INF
[not_a_number] => NAN
)
json_encode(): {"positive_infinity":0,"negative_infinity":0,"not_a_number":0}
Est-il un moyen de coder correctement ces chiffres sans avoir à écrire de ma propre json_encode()
fonction? Peut-être que certains solution de contournement?
source d'informationauteur Septagram
Vous devez vous connecter pour publier un commentaire.
Selon spécification JSON, il n'y a pas de Débordement ou de valeurs NaN: http://json.org/
Solutions de contournement:
Rejeter à l'aide de JSON (pur JSON), et d'écrire votre propre fonction json_encode, qui va gérer INF/NAN (conversion à "l'Infini" et "NaN", respectivement), et assurez-vous de parsing JSON à l'aide de quelque chose comme
result = eval('(' + json + ')');
sur le côté client.Avant de convertir votre IFN/NAN valeurs dans la chaîne de valeurs ("Infini" et "NaN"), et quand vous allez à fonctionner avec ces valeurs, en JavaScript, l'utilisation de la construction suivante:
var number1 = (+numbers.positive_infinity);
. Cela vous permettra de transformer la chaîne de valeur "Infini" en numériqueInfinity
représentation.C'est à mon avis un grand manque de JSON. Différents JSON encodeurs gérer cela différemment, un aperçu peut être trouvée ici: http://lavag.org/topic/16217-cr-json-labview/?p=99058
Une solution est de coder +inf +1e9999 sera naturellement dépassement de +inf dans la plupart des décodeurs, et même avec -inf ceux -1e9999. NaN est beaucoup plus difficile.
Vous avez raison sur le Spécification JSON:
La solution doit aussi venir de la spec, depuis une coutume "JSON" codeur ne serait pas produire de JSON valide de toute façon (vous pouvez écrire un personnalisé du décodeur, et vous et les consommateurs de vos données seraient obligés de l'utiliser jusqu'à la fin des temps).
Ici' ce que la spécification permet de valeurs:
Donc, toute solution de contournement consiste juridique JSON au lieu d'une coutume JSON comme protocole impliquerait en utilisant quelque chose d'autre à la place des numéros.
Une option raisonnable serait d'utiliser les chaînes de
"Infinity"
et"NaN"
pour ces cas limites.L'avertissement mentionné ci-dessus, il est officiel bug signalé dans la documentation de php.
https://bugs.php.net/bug.php?id=64695
Comme une mise à jour pour les lecteurs de cette question pour les nouvelles versions de PHP >= 5.5.0, pour obtenir
INF
ouNAN
valeurs dejson_encode
être encodé comme0
plutôt quejson_encode
défaut de sortie, ajouter la JSON_PARTIAL_OUTPUT_ON_ERROR option.Comme un exemple:
json_encode($data, JSON_NUMERIC_CHECK | JSON_PARTIAL_OUTPUT_ON_ERROR);