2009-11-22 6 views
6

im Schreiben eines Twitter-Mashup-Service. Wenn ich die JSON-Daten erhalte, sind einige der Twit-IDs größer als (dies ist die maximal zulässige Ganzzahl auf 32-Bit-Servern).PHP json_decode auf einem 32-Bit-Server

Ich kam mit einer Lösung, die funktioniert, die die Ganzzahlen in Strings konvertiert; Auf diese Weise hat die Funktion json_decode() keine Probleme beim Versuch, das Array zu generieren.

Das ist, was ich erreichen müssen:

Vor (original JSON-Daten)

[{"name":"john","id":5932725006},{"name":"max","id":4953467146}] 

Nach (Lösung angewendet)

[{"name":"john","id":"5932725006"},{"name":"max","id":"4953467146"}] 

Ich denke an eine preg_match-Implementierung, aber ich habe keine Ahnung, wie man es kugelsicher macht. Jede Hilfe wird sehr geschätzt.

Antwort

12

können Sie preg_replace verwenden, um die Zahlen zu erfassen und die Anführungszeichen, so etwas wie hinzufügen:

$jsonString = '[{"name":"john","id":5932725006},{"name":"max","id":4953467146}]'; 

echo preg_replace('/("\w+"):(\d+)/', '\\1:"\\2"', $jsonString); 
//prints [{"name":"john","id":"5932725006"},{"name":"max","id":"4953467146"}] 

here das obige Beispiel Versuchen.

+2

Sie wollen '" id ":' in diesem Ausdruck, sicher? Andernfalls wird es mit einer beliebigen Zahlenfolge übereinstimmen, wodurch jede Zeichenfolge, die eine Ziffer enthält, stark beschädigt wird. – bobince

+0

genau. es funktioniert gut ... aber es wäre besser, wenn es nur die Ziffern in der Nähe von "id" würde: – andufo

+0

@bobnice: Zustimmen, bearbeitet :) – CMS

1

Wenn Sie PHP 5.2 verwenden, werden diese langen IDs in einen Gleitkommawert geparst, der Ihnen, wenn auch nicht ideal, mindestens 21 Bits ganzzahliger Genauigkeit liefert, die leicht ausreichen sollten, um diese IDs zu speichern. (Ein 64-Bit-Server wäre natürlich ideal.)

+0

Der Server, auf dem dies ausgeführt wird, verfügt über php4- und php5-Umgebungen. Um php5 zu aktivieren, muss ich dieses Flag in der .htaccess-Datei setzen: AddType application/x-httpd-php5 .php Vielleicht diese seltsame Einstellung wird mich nicht die Int2float-Funktion bekommen. Danke für die Info. – andufo

+0

Das sollte funktionieren, aber Sie können leider immer noch eine ältere Version von PHP5 verwenden. – bobince

0

Wenn es darauf ankommt, können Sie versuchen, die big_int PECL-Erweiterung zu verwenden. Dadurch kann PHP bei Bedarf sehr große Zahlen verwenden. Es ist ein großer Schritt, aber wenn du dich regelmäßig mit Zahlen beschäftigst, die an die Grenze der Aufmerksamkeit geraten sind, wirst du es wahrscheinlich hilfreich finden.