2010-05-25 6 views
19

estoy usando FQL para recuperar una lista de usuarios de Facebook. Por consistencia, obtengo el resultado como JSON. Esto causa un problema: dado que el JSON devuelto codifica las ID de usuario como números, json_decode() convierte estos números a valores de coma flotante, porque algunos son demasiado grandes para caber en un int; por supuesto, necesito estas identificaciones como cadenas.Manejo de los ID de usuario grandes devueltos por FQL en PHP

Desde json_decode() hace su propia cosa sin aceptar ninguna bandera de comportamiento, estoy en una pérdida. ¿Algunas sugerencias para resolver esto?

Respuesta

28

json_decode() puede convertir grandes números enteros a cadenas, si especifica una bandera en la función de llamada:

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

Ni idea de cómo iba a faltar que en la documentación. ¡Gracias! – ggambett

+0

Esto solo está en una versión de desarrollo de PHP, al menos según la documentación en php.net? –

+0

@Sebastian Hoitz, la página no se ha actualizado en mucho tiempo, según ella, el parámetro debería estar disponible desde PHP 5.3 (que fue lanzado hace mucho tiempo). –

5

rápida y sucia, parece que funciona por ahora:

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

que tenían un parecido problema en el que json_decode estaba convirtiendo ID recientes de Twitter/tweet en números exponenciales.

respuesta de Björn es grande si usted quiere que su BIGINT para convertirse en una cadena - y tienen PHP 5.3+. Si ninguna de esas cosas es verdadera, otra opción es aumentar la precisión de flotación de PHP. Esto se puede hacer a diferentes pocas maneras ...

  • encontrar el valor precision en su php.ini y modificarlo para que precision = 20
  • ini_set('precision', 20); añadir a su aplicación PHP
  • añadir php_value precision 20 a la aplicación de. htaccess o archivo de host virtual
+0

Simple y fácil. Por cierto, ¿podemos ajustar el número '20' para que pueda acomodar el valor largo? –

+0

Agrego esta línea a mi .htaccess php_value precision 20. En el primer sitio, esto funciona bien. Pero cuando agrego esto en el otro sitio, recibí un error interno de 500 servidores. ¿Qué reemplazo debería usar? –

20

he resuelto el problema mediante la adición de &format=json-strings a la llamada FQL API, así:

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

Esto le dice a facebook para envolver todos los números entre comillas, lo que conduce json_decode utilizar ni no int-S flotadores.

Porque me temo que este problema no está restringido a FQL sino a todas las API de gráficos que eligen representar algunas de las ID como BIG-INTs, he llegado a parchar el PHP SDK de Facebook un poco para forzar a Facebook devuelve todos sus números como cadenas.

He añadido esta línea a la función _graph. Esta sería la línea 738 en facebook_base.php, versión 3.1.1

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

Claro fijar

+1

Esto funciona para aquellos de nosotros que no estamos utilizando el último PHP y, por lo tanto, no tenemos JSON_BIGINT_AS_STRING. –

+0

Esta fue la respuesta más sólida para mí. Formato $ myQuery = $ facebook-> api ("/ FQL", array ( \t "q" => "SELECT uid2 DE DONDE amigo uid1 mí() =", ": en caso de que tropieza a través de esta tarde "=>" json-strings " )); – Fraccus

+0

es la mejor respuesta! – SteMa

3

utilizo este y funciona casi grande.

json_decode(preg_replace('/("\w+"):(\d+)/', '\\1:"\\2"', $jsonString), true) 

El json se rompe cuando hay geo datos incluidos, por ejemplo.{"lat":54.2341} resultados en "lat":"54".2341

Solución:

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

¡Gracias! ¡Eso me cortó! Este problema debería solucionarse pronto en el lado de Facebook: https://developers.facebook.com/bugs/254502934666393 –

+0

Este patrón también funcionará ya que coincide con los dígitos y puntos en un grupo de captura: 'preg_replace ('/ (" [\ w.] + "): ([\ d.] +)/',' \\ 1:" \\ 2 "', $ json);' – bejonbee

0

Este (preg_replace('/("\w+"):(\d+)(.\d+)?/', '\\1:"\\2\\3"', $json);) trabajó para mí (para analizar resultado de Facebook API)

Cuestiones relacionadas