2010-05-25 5 views
19

Ich benutze FQL, um eine Liste der Benutzer von Facebook abzurufen. Aus Gründen der Konsistenz erhalte ich das Ergebnis als JSON. Dies führt zu einem Problem - da der zurückgegebene JSON die Benutzer-IDs als Zahlen codiert, konvertiert json_decode() diese Zahlen in Fließkommawerte, weil einige zu groß sind, um in einen int zu passen; Natürlich brauche ich diese IDs als Strings.Umgang mit großen Benutzer-IDs von FQL in PHP zurückgegeben

Da json_decode() sein eigenes Ding tut, ohne irgendwelche Verhaltensflags zu akzeptieren, bin ich ratlos. Irgendwelche Vorschläge, wie man das löst?

Antwort

28

json_decode() großen ganzen Zahlen in Strings umwandeln können, wenn Sie ein Flag in der Funktionsaufruf angeben:

$array = json_decode($json, true, 512, JSON_BIGINT_AS_STRING) 
+0

keine Ahnung, wie konnte ich vermisse, dass in der Dokumentation. Vielen Dank! – ggambett

+0

Dies ist nur in einer dev Version von PHP - zumindest nach der Dokumentation auf php.net? –

+0

@Sebastian Hoitz, Die Seite wurde seit langer Zeit nicht mehr aktualisiert, demzufolge sollte der Parameter ab PHP 5.3 verfügbar sein (was vor einer "langen" Zeit veröffentlicht wurde). –

5

Schnell und schmutzig, scheint jetzt zu funktionieren:

$sJSON = preg_replace('/:(\d+)/', ':"${1}"', $sJSON); 
8

hatte ich ein ähnliches Problem, bei dem json_decode kürzlich twitter/tweet IDs in exponentielle Zahlen umwandelte.

Björns Antwort ist großartig, wenn Sie möchten, dass Ihr BIGINT eine Zeichenkette wird - und PHP 5.3+ hat. Wenn keines dieser Dinge wahr ist, besteht eine andere Möglichkeit darin, die Float-Genauigkeit von PHP zu erhöhen. Dies kann eine andere wenige Arten geschehen ...

  • den precision Wert in der php.ini finden und es
  • hinzufügen ini_set('precision', 20); auf Ihre PHP-Anwendung
  • hinzufügen php_value precision 20 zu Ihrer App zu precision = 20 ändern. .htaccess oder virtuelle Host-Datei
+0

Einfach und einfach. BTW, können wir die Zahl '20' so einstellen, dass sie lange Werte aufnehmen kann? –

+0

Ich füge diese Zeile meiner .htaccess php_value-Präzision 20 hinzu. Auf der ersten Site funktioniert das gut. Aber wenn ich das auf der anderen Seite hinzufüge, habe ich 500 interne Serverfehler bekommen. Welchen Ersatz sollte ich verwenden? –

20

ich habe das Problem gelöst, indem &format=json-strings zu meinem dem FQL api Gespräch hinzugefügt wird, etwa so:

$myQuery = "SELECT uid2 FROM friend WHERE uid1=me()"; 
$facebook->api("/fql?q=" . urlencode($myQuery) . "&format=json-strings") 

Book sagt, alle Zahlen in Anführungszeichen zu setzen, das json_decode führt weder int-s nicht schwimmt zu verwenden.

Weil ich Angst hatte dieses Problem nicht auf FQL beschränkt, sondern auf alle Graph-API-Aufrufe, die einige der IDs darzustellen, wie BIG-INTs wähle ich habe so weit ging wie facebook PHP SDK ein bisschen Patchen Facebook zu zwingen, gebe alle seine Zahlen als Strings zurück.

Ich habe diese eine Zeile zur _graph Funktion hinzugefügt. Dies würde Linie 738 in facebook_base.php sein, Version 3.1.1

$params['format'] = 'json-strings'; 

sicher fixieren

+1

Dies funktioniert für diejenigen von uns, die nicht das neueste PHP verwenden und daher kein JSON_BIGINT_AS_STRING haben. –

+0

Das war die beste Antwort für mich. Nur falls Sie über diese später stolpern: $ myQuery = $ Facebook-> api ("/ FQL", array ( \t "q" => "SELECT UID2 FROM Freund WHERE UID1 me =()", „-Format "=>" json-strings " )); – Fraccus

+0

ist die beste Antwort! – SteMa

3

Ich benutze dies und es funktioniert fast groß.

Der JSON bricht, wenn Geodaten enthalten sind, z.{"lat":54.2341} Ergebnisse in "lat":"54".2341

Lösung:

$json = preg_replace('/("\w+"):(\d+)(.\d+)?/', '\\1:"\\2\\3"', $json); 
+0

Danke! Das schnitt es für mich! Dieses Problem sollte jedoch bald auf der Facebook-Seite behoben werden: https://developers.facebook.com/bugs/254502934666393 –

+0

Dieses Muster funktioniert auch, da es Ziffern und Punkte in einer Erfassungsgruppe entspricht: 'preg_replace ('/ (" [\ w.] + "): ([\ d.) +)/',' \\ 1:" \\ 2 "', $ json);' – bejonbee

0

Diese (preg_replace('/("\w+"):(\d+)(.\d+)?/', '\\1:"\\2\\3"', $json);) für mich gearbeitet (für resultieren aus facebook api Parsen)