2012-03-28 82 views
6

把這個代碼:PHP:JSON解碼極限

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

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

很簡單,嗯?

傳遞一個最多500個數組元素的$ json ....正常工作!

超過該限制......錯誤是:

警告: /c/website/retriever/WsGlassRetriever.php爲的foreach()提供的在線無效參數19

該函數的參數是否有一些內存限制?

我在文檔中沒有發現任何關於它的信息。我的版本是帶有Suhosin-Patch 0.9.7(cli)的PHP 5.2.17-rnx1.1

+1

是什麼'的var_dump($解碼)'給你? – 2012-03-28 13:24:02

+1

我不認爲它的限制。它沒有限制。嘗試'var_dump($ decode)'來查看類型 – safarov 2012-03-28 13:24:45

+1

它可能不是因爲元素的數量,而是因爲無法解碼的特定元素。在PHP 5.3中有json_last_error()函數。還要注意深度限制(默認512) – 2012-03-28 13:24:58

回答

11

json_decode如果在JSON語法中有錯誤,則返回NULL。我剛剛成功測試了1000個元素的數組,它運行得很好。

仔細檢查您的JSON格式是否正確。即使是單引號而不是雙引號,或者忘記將屬性名稱放在引號中,或者使用32-127範圍以外的字符,而沒有在UTF-8中正確編碼,也可能導致這些問題。上述500

+0

好的。這是一個畸形的utf-8錯誤。我看着我的JSON,在那裏我發現了一個'''字符,這是一個糟糕的UTF8 ...那麼用php來驗證我的utf-8 json? – 2012-04-02 06:32:37

5

敢肯定你的JSON代碼的格式存在問題,已經使用JSON在這裏超過20,000值是2000陣列的一個簡單的腳本

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

編輯2

我很感興趣知道是否有任何限制..只測試它與250,000(二十五萬的價值觀,它工作正常)

謝謝 Oleku

0

在我的情況下,JSON是正確的。我的問題是導致錯誤「超過最大堆棧深度」的「JSON_BIGINT_AS_STRING」參數。

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

我去掉了 「JSON_BIGINT_AS_STRING」 的說法和錯誤消失:

$jsonResult = json_decode($expr,true);