2012-03-28 26 views
6

Tome este código:PHP: JSON límites decodificar

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

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

Bastante simple, eh?

Pasar $ json con hasta 500 elementos de matriz ... funciona bien!

Por encima de ese límite ... el error es:

Advertencia: Invalid argument supplied for foreach() en /c/website/retriever/WsGlassRetriever.php en la línea 19

¿Hay algún límite de memoria para el argumento de esa función?

No encontré nada al respecto en los documentos. Mi versión es PHP 5.2.17-rnx1.1 con Suhosin-Patch 0.9.7 (cli)

+1

¿Qué 'var_dump ($ decodificación)' le dan? –

+1

no creo que su límite. No es limite intente 'var_dump ($ decode)' para ver el tipo – safarov

+1

puede ser no debido a la cuenta de los elementos, pero debido a un elemento particular que no se puede decodificar. En php 5.3 existe la función json_last_error(). También tenga en cuenta el límite de profundidad (512 de forma predeterminada) –

Respuesta

11

json_decode devuelve NULL si hay un error en la sintaxis JSON. Acabo de probar con éxito en una matriz de 1000 elementos y funcionó perfectamente.

Compruebe dos veces si su JSON está formateado correctamente. Incluso algo tan pequeño como tener comillas simples en lugar de dobles, o olvidar poner un nombre de propiedad entre comillas, o usar un carácter fuera del rango 32-127 sin codificarlo correctamente en UTF-8 puede causar estos problemas.

+0

Ok. fue un error mal formado de utf-8.Miré a mi json y allí encontré un '' char 'que era malo utf8 ... ¿Qué tal validar mi jf utf-8 sobre la marcha con php? –

5

estoy seguro de su código JSON por encima de 500 tiene un problema de formato, se han utilizado JSON con más de 20.000 valores aquí es un simple script de 2000 gama

$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(); 
} 

Editar 2

yo estaba tan interesado para saber si hay alguna limitación .. acaba de probarlo con 250,000 (Doscientos cincuenta mil valores y funciona bien)

Gracias Oleku

0

En mi caso, el JSON era correcto. Mi problema era el parámetro "JSON_BIGINT_AS_STRING" que causaba el error "Se excedió la profundidad máxima de la pila".

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

que eliminan el argumento "JSON_BIGINT_AS_STRING" y el error se ha ido:

$jsonResult = json_decode($expr,true);