2012-03-28 42 views
6

Hãy mã này:PHP: json giới hạn decode

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

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

Khá đơn giản, uh?

Truyền $ json với tối đa 500 phần tử mảng .... hoạt động đúng!

Trên giới hạn đó ... lỗi là:

Cảnh báo: đối số không hợp lệ được cung cấp cho foreach() trong /c/website/retriever/WsGlassRetriever.php trên đường dây 19

Có giới hạn bộ nhớ nào cho đối số của hàm đó không?

Tôi không tìm thấy gì về nó trong tài liệu. Phiên bản của tôi là PHP 5.2.17-rnx1.1 với Suhosin-Patch 0.9.7 (cli)

+1

gì 'var_dump ($ decode) 'cung cấp cho bạn? –

+1

tôi không nghĩ rằng giới hạn của nó. Không giới hạn của nó. thử 'var_dump ($ decode)' để xem loại – safarov

+1

nó có thể không phải vì số lượng các phần tử, mà vì phần tử cụ thể không thể giải mã được. Trong php 5.3 có hàm json_last_error(). Đồng thời, hãy nhớ giới hạn độ sâu (512 theo mặc định) –

Trả lời

11

json_decode trả về NULL nếu có lỗi trong cú pháp JSON. Tôi vừa thử nghiệm thành công trên một mảng gồm 1000 phần tử và nó chạy tốt.

Kiểm tra kỹ xem JSON của bạn có được định dạng chính xác hay không. Ngay cả một cái gì đó nhỏ như có dấu nháy đơn thay vì gấp đôi, hoặc quên đặt tên thuộc tính trong dấu ngoặc kép hoặc sử dụng ký tự bên ngoài phạm vi 32-127 mà không mã hóa chính xác nó trong UTF-8 có thể gây ra những vấn đề này.

+0

Ok. đó là lỗi utf-8 không đúng định dạng.Tôi nhìn vào json của tôi và ở đó tôi tìm thấy một 'ì' char đó là xấu utf8 ... Điều gì về việc xác nhận của tôi utf-8 json trên bay với php? –

5

Am chắn rằng mã JSON của bạn trên 500 có một vấn đề định dạng, đã sử dụng JSON với hơn 20.000 giá trị ở đây là một kịch bản đơn giản năm 2000 mảng

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

Chỉnh sửa 2

Tôi rất quan tâm để biết nếu có bất kỳ giới hạn .. chỉ cần thử nghiệm nó với 250.000 (Hai trăm năm mươi nghìn giá trị và nó hoạt động tốt)

Thanks Oleku

0

Trong trường hợp của tôi, JSON là chính xác. Vấn đề của tôi là thông số "JSON_BIGINT_AS_STRING" đã gây ra lỗi "Độ sâu ngăn xếp tối đa đã vượt quá".

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

tôi loại bỏ các lập luận "JSON_BIGINT_AS_STRING" và các lỗi đã biến mất:

$jsonResult = json_decode($expr,true);