2012-03-28 17 views
6

Prendere questo codice:PHP: json limiti di decodifica

$json = file_get_contents($this->url, true); 
$decode = json_decode($json, true); 

foreach ($decode as $key => $value) { 
... 
} 

Abbastanza semplice, eh?

Passando a $ json con un massimo di 500 elementi di array .... funziona bene!

Superato tale limite ... l'errore è:

Warning: Invalid argument in dotazione per foreach() in /c/website/retriever/WsGlassRetriever.php on line 19

C'è qualche limite di memoria per l'argomento di quella funzione?

Non ho trovato nulla a riguardo nei documenti. La mia versione è PHP 5.2.17-rnx1.1 con Suhosin-Patch 0.9.7 (cli)

+1

Cosa 'var_dump ($ decodifica)' darvi? –

+1

non penso al limite. Non è un limite. prova 'var_dump ($ decode)' per vedere il tipo – safarov

+1

potrebbe non essere dovuto al conteggio degli elementi, ma a causa di elementi particolari che non possono essere decodificati. In PHP 5.3 c'è la funzione json_last_error(). Ricorda anche il limite di profondità (512 di default) –

risposta

11

json_decode restituisce NULL se c'è un errore nella sintassi JSON. Ho appena testato con successo su un array di 1000 elementi e ha funzionato bene.

Verificare che il JSON sia formattato correttamente. Anche qualcosa di così piccolo come avere virgolette singole invece di doppie, o dimenticare di inserire il nome di una proprietà tra virgolette, o usare un carattere al di fuori dell'intervallo 32-127 senza codificarlo correttamente in UTF-8 può causare questi problemi.

+0

Ok. era un errore utf-8 malformato.Ho guardato il mio json e lì ho trovato un 'ì' char che era brutto utf8 ... Che ne dici di convalidare il mio utf-8 json al volo con php? –

5

Am che il codice JSON di sopra di 500 ha un problema di formattazione, hanno utilizzato JSON con oltre 20.000 valori Ecco un semplice script del 2000 serie

$string = "Sample String Data ¶"; 
$string = preg_replace('/[^[:print:]]/', '',$string); // remove all values that can affect JSON 
$array = array(); 
for($i = 0 ; $i < 2000; $i++) 
{ 
    if(mt_rand(0, 1)) 
    { 
     $array[] = $string ; 
    } 
    else 
    { 
     $array[] = array($string,1,$string) ; 
    } 
} 

$json = json_encode($array); 
$decodeArray = json_decode($json); 

switch (json_last_error()) { 
    case JSON_ERROR_NONE: 
     echo ' - No errors'; 
     break; 
    case JSON_ERROR_DEPTH: 
     echo ' - Maximum stack depth exceeded'; 
     break; 
    case JSON_ERROR_STATE_MISMATCH: 
     echo ' - Underflow or the modes mismatch'; 
     break; 
    case JSON_ERROR_CTRL_CHAR: 
     echo ' - Unexpected control character found'; 
     break; 
    case JSON_ERROR_SYNTAX: 
     echo ' - Syntax error, malformed JSON'; 
     break; 
    case JSON_ERROR_UTF8: 
     echo ' - Malformed UTF-8 characters, possibly incorrectly encoded'; 
     break; 
    default: 
     echo ' - Unknown error'; 
     break; 
} 

echo "<br />" ; 


foreach ($decodeArray as $key => $value) { 
    print_r($value) ; 
    flush(); 
} 

Edit 2

ero così interessato per sapere se c'è qualche limite .. appena testato con 250.000 (Duecentocinquantamila valori e funziona bene)

Grazie Oleku

0

Nel mio caso il JSON era corretto. Il mio problema era il parametro "JSON_BIGINT_AS_STRING" che causava l'errore "Superata la profondità massima dello stack".

$jsonResult = json_decode($expr,true,JSON_BIGINT_AS_STRING); 

ho tolto l'argomento "JSON_BIGINT_AS_STRING" e l'errore è andato:

$jsonResult = json_decode($expr,true);