Ich habe ein Problem mit der PHP-Funktion json_encode. Es codiert Zahlen als Zeichenfolgen, z
array('id' => 3)
wird
"{ ["id": "3", ...)
Wenn js auf diese Werte stößt, werden sie als Zeichenfolgen interpretiert und numerische Operationen schlagen fehl. Kennt jemand eine Möglichkeit, um zu verhindern json_encode
, dass Zahlen als Zeichenfolgen codiert werden? Danke dir!
php
javascript
json
Chris Barnhill
quelle
quelle
Antworten:
Ich habe einen sehr schnellen Test gemacht:
Dies scheint so zu sein, wie Sie es beschreiben, wenn ich mich nicht irre?
Und ich bekomme als Ausgabe:
In diesem Fall wurden die Ganzzahlen also nicht in Zeichenfolgen konvertiert.
Dies hängt jedoch möglicherweise von der von uns verwendeten PHP-Version ab: Abhängig von der PHP-Version wurden einige Fehler im Zusammenhang mit json_encode behoben ...
Dieser Test wurde mit PHP 5.2.6 durchgeführt; Ich bekomme das gleiche mit PHP 5.2.9 und 5.3.0; Ich habe jedoch keine andere 5.2.x-Version zum Testen :-(
Welche PHP-Version verwenden Sie? Oder ist Ihr Testfall komplexer als das von Ihnen veröffentlichte Beispiel?
Vielleicht könnte ein Fehlerbericht auf http://bugs.php.net/ verwandt sein? Zum Beispiel Fehler # 40503: Die Ganzzahlkonvertierung von json_encode ist nicht mit PHP vereinbar .
Vielleicht könnte Sie auch Bug # 38680 interessieren?
quelle
Beachten Sie, dass es seit PHP 5.3.3 ein Flag für die automatische Konvertierung von Zahlen gibt (der Parameter options wurde in PHP 5.3.0 hinzugefügt):
quelle
JSON_NUMERIC_CHECK
versucht automatisch zu erraten, ob eine Zeichenfolge eine Zahl ist oder nicht, indem versucht wird, sie zu analysieren. Das ist ziemlich unzuverlässig, wenn man darüber nachdenkt. Es konvertiert alle numerisch aussehenden Eigenschaften in Zahlen (nicht nur die gewünschten) und dies nur, wenn sie wie Zahlen aussehen. Das ist zumindest wackelig, wenn nicht unsicher. Der Code, der den erzeugten JSON verwendet, hängt möglicherweise vom Typ ab. Seltsame Dinge können passieren, wenn diese Erwartungen nicht erfüllt werden. Wenn Sie sich für bewährte Verfahren und Sicherheit interessieren, sollten Sie die gewünschten Werte selektiv konvertieren.Ich habe ebenfalls aus einer DB (PostgreSQL) gelesen und alles war ein String. Wir durchlaufen jede Zeile und machen Dinge damit, um unser endgültiges Ergebnisarray aufzubauen, also habe ich es verwendet
innerhalb der Schleife, um zu erzwingen, dass es sich um einen ganzzahligen Wert handelt. Wenn ich es
json_encode($result_arr)
jetzt mache , formatiert es es korrekt als Zahl. Auf diese Weise können Sie steuern, welche Nummer aus Ihrer Datenbank stammt und welche nicht.BEARBEITEN:
Die
json_encode()
Funktion kann dies auch im laufenden Betrieb tun, indem sie dasJSON_NUMERIC_CHECK
Flag als zweites Argument verwendet. Sie müssen jedoch vorsichtig damit umgehen, wie in diesem Benutzerbeispiel in der Dokumentation (unten kopiert) gezeigt: http://uk3.php.net/manual/en/function.json-encode.php#106641Und dann bekommen Sie diesen JSON:
quelle
json_encode
Funktion. Dies ist die richtigste Antwort, aber seien Sie vorsichtig, daJSON_NUMERIC_CHECK
auch Telefonnummern und andere numerische Zeichenfolgenwerte konvertiert werden. Dies kann zu Problemen bei führenden Nullen oder '+' führen. Ich empfehle, dieses Problem in der DB-Lesefunktion zu beheben.Ich habe das gleiche Problem (PHP-5.2.11 / Windows). Ich verwende diese Problemumgehung
Dies ersetzt alle (nicht negativen, ganzzahligen) Zahlen in Anführungszeichen durch die Zahl selbst ("42" wird zu "42").
Siehe auch diesen Kommentar im PHP-Handbuch .
quelle
$json_array = json_encode($some_array, false);
Das falsche Argument weist PHP an, die Objektkonvertierung nicht durchzuführen.json_encode(array(-1=>'que', '0'=>'-1'))
$this->data = preg_replace("/\" *?: *?(\d+)/", '":"$1"', $this->data);
Versuchen
$arr = array('var1' => 100, 'var2' => 200);
$json = json_encode( $arr, JSON_NUMERIC_CHECK);
Aber es funktioniert nur unter PHP 5.3.3. Sehen Sie sich dieses PHP-Änderungsprotokoll für json_encode an: http://php.net/manual/en/function.json-encode.php#refsect1-function.json-encode-changelog
quelle
Der folgende Test bestätigt, dass das Ändern des Typs in eine Zeichenfolge dazu führt, dass json_encode () eine Zahl als JSON-Zeichenfolge zurückgibt (dh von doppelten Anführungszeichen umgeben). Verwenden Sie Settype (arr ["var"], "integer") oder Settype ($ arr ["var"], "float"), um das Problem zu beheben.
quelle
Der Vollständigkeit halber (da ich noch keine Kommentare hinzufügen kann) möchte ich dieses Detail auch als weitere Antwort hinzufügen:
(Bearbeiten: Wird gelesen, nachdem erkannt wurde, dass die Quelldaten (dh im Fall des OP die Datenbank-Ergebnismenge) das Problem sein könnten (indem numerische Spalten als Zeichenfolgen zurückgegeben werden), und json_encode () war tatsächlich nicht die Quelle des Problems.)
Handbuchseiten beider " mysql_fetch_array ":
... und " mysql_ fetch_ row ":
stellt klar fest, dass; Die Einträge im zurückgegebenen Array sind Zeichenfolgen.
(Ich habe die DB-Klasse in phpBB2 verwendet (ja, ich weiß, sie ist veraltet!), Und die Methode "sql_fetchrow ()" dieser Klasse verwendet "mysql_fetch_array ()".)
Da ich das nicht bemerkte, fand ich auch diese Frage und verstand das Problem! :) :)
Wie Pascal Martin oben in seinen nachfolgenden Kommentaren ausgeführt hat, glaube ich, dass eine Lösung das Problem des "falschen Typs" an der Quelle behebt ( dh indem die Funktion " mysql_field_type () " verwendet und das Casting direkt nach dem Abrufen durchgeführt wird (oder) andere Abrufmethoden wie "Objekt"?)) wären im Allgemeinen besser.
quelle
So Pascal MARTIN bekommt nicht genug Kredit hier. Die Überprüfung auf numerische Werte bei jeder JSON-Rückgabe ist für ein vorhandenes Projekt mit Hunderten von serverseitigen Funktionen nicht möglich.
Ich habe php-mysql durch php-mysqlnd ersetzt und das Problem ist verschwunden. Zahlen sind Zahlen, Zeichenfolgen sind Zeichenfolgen, Boolesche Werte sind Boolesche Werte.
quelle
Ich hatte auch das gleiche Problem bei der Verarbeitung von Daten aus der Datenbank. Grundsätzlich besteht das Problem darin, dass der Typ in dem Array, der in json konvertiert werden soll, von PHP als Zeichenfolge und nicht als Ganzzahl erkannt wird. In meinem Fall habe ich eine Abfrage durchgeführt, die Daten aus einer DB-Spaltenzählzeile zurückgibt. Der PDO-Treiber erkennt die Spalte nicht als int, sondern als Zeichenfolgen. Ich habe es gelöst, indem ich eine Besetzung als int in der betroffenen Spalte ausgeführt habe.
quelle
quelle
Es ist PHP-Version das Problem, hatte das gleiche Problem meine PHP-Version auf 5.6 aktualisiert, löste das Problem
quelle
Das Umwandeln der Werte in ein int oder float scheint dies zu beheben. Beispielsweise:
quelle
Sie können (int) verwenden, wenn ein Problem auftritt !! Es wird gut funktionieren.
quelle
Stoßen Sie einfach auf dasselbe Problem und die Datenbank hat die Werte als Zeichenfolgen zurückgegeben.
Ich benutze dies als Problemumgehung:
Das heißt, Sie multiplizieren den Wert mit 1, um ihn in eine Zahl umzuwandeln
Hoffe das hilft jemandem
quelle
json_encode serialisiert einige Datenstrukturen im JSON-Format, die über das Netzwerk gesendet werden sollen. Daher ist der gesamte Inhalt vom Typ Zeichenfolge. Genau wie wenn Sie einen Parameter von $ _POST oder $ _GET erhalten.
Wenn Sie numerische Operationen für die gesendeten Werte ausführen müssen, konvertieren Sie diese einfach zuerst in int (mit der Funktion intval () in PHP oder parseInt () in Javascript) und führen Sie dann die Operationen aus.
quelle
Nun, PHP json_encode () gibt einen String zurück.
Sie können parseFloat () oder parseInt () im js-Code verwenden:
quelle
Wie oli_arborum sagte, ich denke, Sie können ein
preg_replace
für die Arbeit verwenden. Ändern Sie einfach den Befehl wie folgt:quelle