2012-01-06 9 views
5

Quindi sto usando php 5.2.6 in un ambiente WAMP.Come aggirare o fare in modo che PHP json_decode non modifichi i miei valori interi molto grandi?

Sto cercando di utilizzare la funzione json_decode per creare una stringa json in una matrice. Il JSON proviene da un'API REST altrove, quindi non ho il controllo sulla formattazione della stringa JSON. Ecco un esempio di una delle stringhe JSON che sto cercando di utilizzare:

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

Sono in particolare dopo il valore SessionKey qui. PHP sta trattando il valore come un float e non riesco a fare nulla per recuperare il valore originale.

ho provato il seguente:

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 

ho provato anche questo:

$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 

Come detto, l'aggiornamento a PHP 5.4 (dove la chiamata json_decode 4 parametro è supportato) non è un'opzione. Per favore aiuto!

Grazie!

+0

Penso che ci sia un duplicato qui su SO da qualche parte, potrebbe valere la pena cercare –

+1

Si potrebbe guardare a questa domanda. Alcune persone hanno elencato le soluzioni dopo che il JSON è stato restituito ma prima che sia decodificato. http://stackoverflow.com/q/2907806/2863 –

risposta

3

Grazie a @Scott Gottreu e @pospi.

La risposta era nell'ultimo commento per la risposta accettata su this question.

Utilizzare la funzione preg_replace() per racchiudere tutti i valori interi tra virgolette.

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

realtà dopo prove di linea superiore si avvita su JSON con numeri in virgola mobile come valori modo per risolvere tale problema ho usato il seguente racchiudere solo tutti i numeri (numeri in virgola interi o variabile) in apici:

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

Nel caso si tratti di numeri negativi, basta aggiungere il simbolo '-' come facoltativo nella espressione regolare: ' $ json = preg_replace ('/ ("\ w + "): (-? \ d + (\. \ d +)?)/',' \\ 1:" \\ 2 "', $ json)' – joserobleda

7

Per qualità uso JSON spec:

// 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

questa era l'unica cosa che ha funzionato per me +1 –

+2

Wont this JSON corrotto contenente stringhe con due punti e numeri? – Phil

+0

Phil_1984_ si penso che tu abbia ragione. Specificamente sarebbe per una stringa con due punti e un intero JSON. Suppongo che sia necessario verificare la presenza di una virgoletta doppia senza escape prima del colon per garantire che non sia una stringa ma una proprietà. –

2

Nel frattempo, PHP ha risolto questo problema ... beh, in qualche modo. A partire intorno al PHP 5.4 hanno aggiunto un'opzione che fa il proprio ciò che le soluzioni Regex postato cui sopra:

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

La 512 si riferisce alla profondità massima di default di nidificazione.