2012-01-06 11 views
5

Así que estoy usando php 5.2.6 en un entorno WAMP.¿Cómo moverse o hacer que PHP json_decode no altere mis valores enteros muy grandes?

Estoy tratando de usar la función json_decode para hacer una cadena json en una matriz. El JSON proviene de una API REST en otro lugar, por lo que no tengo control sobre el formato de la cadena JSON. Aquí está un ejemplo de una de las cadenas JSON que estoy tratando de usar:

[{ 
    "webinarKey":795855906, 
    "sessionKey":100000000041808257, 
    "startTime":"2011-12-16T13:56:15Z", 
    "endTime":"2011-12-16T14:48:37Z", 
    "registrantsAttended":2 
}] 

Estoy especialmente después de que el valor SessionKey aquí. PHP trata el valor como un flotante y parece que no puedo hacer nada para recuperar el valor original.

he probado el siguiente:

json_decode($json, true, 512, JSON_BIGINT_AS_STRING); 
# This produces the following error because my php version isn't up to snuff and I 
# can't upgrade to the version required 
# Warning: json_decode() expects at most 2 parameters, 4 given 

También he intentado esto:

$json_obj = json_decode($json, true); 
number_format($json_obj[0]["sessionKey"], 0, '.', ''); 
# This results in precision issues where the value was 100000000041808257 
# but is number_formated out as 100000000041808256 

Como dije, la actualización a php 5.4 (donde se soporta la llamada json_decode 4 parámetros) no es una opción. ¡Por favor ayuda!

Gracias!

+0

Creo que hay un duplicado aquí en SO en algún lado, podría valer la pena buscar –

+1

Puede consultar esta pregunta. Algunas personas enumeraron las soluciones después de que se haya devuelto el JSON pero antes de que se descodifique. http://stackoverflow.com/q/2907806/2863 –

Respuesta

3

Gracias @Scott Gottreu y @pospi.

La respuesta estaba en el último comentario para la respuesta aceptada en this question.

Utilice la función preg_replace() para rodear todos los valores enteros con comillas.

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

En realidad después de probar la línea anterior se atornilla hasta JSON con números de punto flotante en el que los valores de modo de fijar ese tema he utilizado la siguiente para simplemente encierre todos los números (números de puntos enteros o flotantes) entre comillas:

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

En caso de que tenga números negativos, solo agregue el símbolo '-' como opcional en la expresión regular: ' $ json = preg_replace ('/ ("\ w + "): (-? \ d + (\. \ d +)?)/',' \\ 1:" \\ 2 "', $ json)' – joserobleda

7

Para la calidad del uso JSON especificaciones:

// wrap numbers 
$json = preg_replace('/:\s*(\-?\d+(\.\d+)?([e|E][\-|\+]\d+)?)/', ': "$1"', $json); 
// as object 
$object = json_decode($json); 
// as array 
$array = json_decode($json, true); 
+0

esto fue lo único que funcionó para mí +1 –

+2

Sin este json corrupto que contiene cadenas con dos puntos y números? – Phil

+0

Phil_1984_ sí, creo que tienes razón. Específicamente sería para una cadena con dos puntos y un entero json. Supongo que necesitarás buscar una comilla doble no escapada antes de los dos puntos para garantizar que no sea una cadena, sino una propiedad. –

2

Mientras tanto, PHP ha solucionado este problema ... así, de alguna manera. Comenzando en algún momento alrededor de PHP 5.4, agregaron una opción que hace lo justo lo que las soluciones de expresiones regulares publicados anteriormente hacen:

json_decode($json, false, 512, JSON_BIGINT_AS_STRING); 

El 512 se refiere a la profundidad de anidamiento máximo predeterminado.

Cuestiones relacionadas