2012-03-28 96 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);