2009-11-22 7 views
6

im escribiendo un servicio de twitter mashup. Cuando recibo los datos json, algunos de los identificadores de twittes son mayores que (que es el número máximo permitido en servidores de 32 bits).PHP json_decode en un servidor de 32 bits

Se me ocurrió una solución que funciona, que consiste en convertir los enteros en cadenas; De esta forma, la función json_decode() no tendrá ningún problema cuando intente generar la matriz.

Esto es lo que necesito para lograr:

Antes de datos JSON (originales)

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

Después (solución aplicada)

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

Estoy pensando una implementación de preg_match, pero no tengo idea de cómo hacerlo a prueba de balas. Cualquier ayuda será muy apreciada.

Respuesta

12

Puede utilizar preg_replace para capturar los números y añadir las comillas, algo como esto:

$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"}] 

probar el ejemplo anterior here.

+2

¿Querrá '" id ":' en esa expresión, seguramente? De lo contrario, coincidirá con cualquier secuencia de números, rompiendo mal cualquier cadena que contenga un dígito. – bobince

+0

exactamente. funciona bien ... pero sería mejor si solo coincidiera con los dígitos cerca de "id": – andufo

+0

@bobnice: De acuerdo, editado :) – CMS

1

Si utiliza PHP 5.2, los ID largos se analizarán en un flotador, que aunque no es ideal, al menos le ofrece otros 21 bits de precisión entera, lo que debería ser suficiente para almacenar esos identificadores. (Un servidor de 64 bits sería ideal, por supuesto.)

+0

el servidor donde se ejecuta tiene ambos entornos php4 y php5. para activar php5 tengo que establecer este indicador en el archivo .htaccess: AddType application/x-httpd-php5 .php Quizás esta extraña configuración no me permita obtener la función int2float. Gracias por la informacion sin embargo. – andufo

+0

Eso debería funcionar, pero es posible que, por desgracia, todavía esté ejecutando una versión anterior de PHP5. – bobince

0

Si se trata de eso, puede intentar utilizar la extensión big_int PECL. Esto permite que PHP use números que son extraordinariamente grandes, si es necesario. Es un gran salto, pero si habitualmente estás lidiando con números que están al borde de la embrutecimiento mental, es probable que te resulte útil.

Cuestiones relacionadas