PHP: codieren infinity oder NaN-Nummern zu JSON?
Offenbar, infinity und NaN sind nicht Teil der JSON-Spezifikation, so dass dieser PHP-code:
$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";
Produziert dies:
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}
Gibt es eine Möglichkeit, korrekt zu Kodieren, diese zahlen ohne das schreiben meine eigenen json_encode()
Funktion? Vielleicht irgendein workaround?
InformationsquelleAutor Septagram | 2012-11-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach JSON spec, es gibt keine Unendlichkeit oder NaN-Werte: http://json.org/
Workarounds:
Ablehnen der Verwendung von JSON (Reine JSON), und schreiben Sie Ihre eigenen Funktionen json_encode Funktion, die Sie im Griff-INF/NAN (Umstellung auf "Infinity" und "NaN" bezeichnet), und stellen Sie sicher, Sie sind Parsen von JSON mit so etwas wie
result = eval('(' + json + ')');
auf der client-Seite.Pre konvertieren Sie Ihre IFN/NAN-Werte in string-Werte ('Infinity' und 'NaN'), und wenn Sie gehen, um mit zu betreiben, die diese Werte verwenden Sie in JavaScript den folgenden Aufbau:
var number1 = (+numbers.positive_infinity);
. Dies wird zu konvertieren string-Wert 'Infinity' in numerischeInfinity
Darstellung.InformationsquelleAutor mdevils
Du hast Recht über die JSON spec:
Muss die Lösung auch von der Skillung, da eine eigene "JSON" encoder wäre nicht Valide JSON-sowieso (man müsste so schreiben Sie einen benutzerdefinierten decoder als gut, und dann die Verbraucher, Ihre Daten wären gezwungen, zu verwenden, bis das Ende der Zeit).
Hier' was die spec erlaubt Werte:
So, Abhilfe, beinhaltet die rechtliche JSON anstatt eine benutzerdefinierte JSON-ähnlichen Protokoll würde bedeuten, mit etwas anderes anstelle von zahlen.
Eine vernünftige option wäre die Verwendung der Zeichenfolgen
"Infinity"
und"NaN"
für diese Grenzfälle.InformationsquelleAutor Jon
Dies ist meiner Meinung nach ein großes Manko von JSON. Verschiedene JSON-Encoder handhaben das anders, eine kurze übersicht kann hier gefunden werden: http://lavag.org/topic/16217-cr-json-labview/?p=99058
One-Lösung ist die Codierung +inf +1e9999 als, die natürlich überlaufen zu +inf in den meisten Decodern, und gleichzeitig mit -inf as-1e9999. NaN ist viel schwieriger.
InformationsquelleAutor emilk
Die Warnung oben erwähnt, gibt es offizielle bug berichtet in der php-Dokumentation.
https://bugs.php.net/bug.php?id=64695
InformationsquelleAutor Manjunath Reddy
Als update an die Leser, diese Frage für neueren Versionen von PHP >= 5.5.0, um
INF
oderNAN
Werte vonjson_encode
kodiert werden, wie0
eher alsjson_encode
andernfalls Ausgabe an alle, fügen Sie die JSON_PARTIAL_OUTPUT_ON_ERROR option.Als Beispiel:
json_encode($data, JSON_NUMERIC_CHECK | JSON_PARTIAL_OUTPUT_ON_ERROR);
InformationsquelleAutor Sean Fahey