2012-03-28 34 views
6

Nehmen Sie diesen Code:PHP: json dekodieren Grenzen

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

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

Ziemlich einfach, äh?

Übergabe eines $ json mit bis zu 500 Array-Elementen .... funktioniert richtig!

Oberhalb dieser Grenze ... Der Fehler ist:

Warning: Invalid argument für foreach geliefert() in /c/website/retriever/WsGlassRetriever.php auf Leitung 19

Gibt es ein Speicherlimit für das Argument dieser Funktion?

Ich habe nichts in den Docs gefunden. Meine Version ist PHP 5.2.17-rnx1.1 mit Suhosin-Patch 0.9.7 (cli)

+1

Was bedeutet 'var_dump ($ decode)' Sie geben? –

+1

Ich glaube nicht, seine Grenze. Es ist keine Grenze. Versuchen Sie 'var_dump ($ decode)', um den Typ – safarov

+1

zu sehen, kann es nicht wegen der Anzahl der Elemente sein, sondern wegen eines bestimmten Elements, das nicht decodiert werden kann. In PHP 5.3 gibt es die Funktion json_last_error(). Beachten Sie auch die Tiefenbegrenzung (standardmäßig 512) –

Antwort

11

json_decode gibt NULL zurück, wenn ein Fehler in der JSON-Syntax vorliegt. Ich habe gerade erfolgreich auf einem Array von 1000 Elementen getestet und es lief gut.

Überprüfen Sie, ob Ihr JSON korrekt formatiert ist. Selbst etwas so kleines wie einfache Anführungszeichen anstelle von double oder das Vergessen, einen Eigenschaftsnamen in Anführungszeichen zu setzen oder ein Zeichen außerhalb des 32-127-Bereichs zu verwenden, ohne es in UTF-8 korrekt zu codieren, kann diese Probleme verursachen.

+0

Ok. es war ein missgebildeter utf-8 Fehler.Ich schaute auf meinen JSON und dort fand ich einen '' 'Char, der schlecht war utf8 ... Wie wäre es mit der Validierung meiner utf-8 JSON im laufenden Betrieb mit PHP? –

5

bin sicher, dass Ihre JSON-Code über 500 hat eine Formatierung Ausgabe haben JSON verwendet, um mit mehr als 20.000 Werte hier ein einfaches Skript von 2000 Array ist

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

bearbeiten 2

ich so interessiert war zu wissen, ob es irgendwelche Einschränkungen gibt .. nur getestet mit 250.000 (Zwei hundert und fünfzigtausend Werte und es funktioniert gut)

Danke Oleku

0

In meinem Fall war der JSON korrekt. Mein Problem war der Parameter "JSON_BIGINT_AS_STRING", der den Fehler "Maximale Stapeltiefe überschritten" verursacht hat.

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

Ich entfernte die "JSON_BIGINT_AS_STRING" Argument und der Fehler ist weg:

$jsonResult = json_decode($expr,true);