2012-06-13 34 views
9

Tại sao điều này sẽ lặp lại "NULL"? Theo ý của tôi, nó sẽ được giải mã thành một mảng trống.Tại sao json_decode trả về null cho mảng trống?

Có điều gì đó hiển nhiên tôi bị thiếu không?

<?php 

$json = json_encode(array()); 
$json_decoded = json_decode($json, true); 
// same with json_decode($json); 

if ($json_decoded == null){ 
    echo "NULL"; 
} else 
{ 
    echo "NOT NULL"; 
} 

?> 
+3

nếu bạn thử '$ json_decoded === null' thì sao? – mgraph

+0

@Aelios: không có từ khóa 'mới' cho mảng trong PHP. – prodigitalson

+0

Bạn đang mong đợi để trả lại một cái gì đó khác nhau? – Sena

Trả lời

21

Điều này là do array()==NULL. Nó không kiểm tra kiểu đối tượng trong trường hợp này.

gettype(null) lợi nhuận null, trong khi

gettype(array()) lợi nhuận mảng. Hy vọng bạn có sự khác biệt.

Có lẽ những gì bạn cần là

if ($json_decoded === null) { 
    echo "NULL"; 
} else 
{ 
    echo "NOT NULL"; 
} 
0

này phải làm các trick

if ($json_decoded === null) 

Ví dụ từ manual:

<?php 
$a = array('<foo>',"'bar'",'"baz"','&blong&', "\xc3\xa9"); 

echo "Normal: ", json_encode($a), "\n"; 
echo "Tags: ", json_encode($a, JSON_HEX_TAG), "\n"; 
echo "Apos: ", json_encode($a, JSON_HEX_APOS), "\n"; 
echo "Quot: ", json_encode($a, JSON_HEX_QUOT), "\n"; 
echo "Amp: ",  json_encode($a, JSON_HEX_AMP), "\n"; 
echo "Unicode: ", json_encode($a, JSON_UNESCAPED_UNICODE), "\n"; 
echo "All: ",  json_encode($a, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE), "\n\n"; 

$b = array(); 

echo "Empty array output as array: ", json_encode($b), "\n"; 
echo "Empty array output as object: ", json_encode($b, JSON_FORCE_OBJECT), "\n\n"; 

$c = array(array(1,2,3)); 

echo "Non-associative array output as array: ", json_encode($c), "\n"; 
echo "Non-associative array output as object: ", json_encode($c, JSON_FORCE_OBJECT), "\n\n"; 

$d = array('foo' => 'bar', 'baz' => 'long'); 

echo "Associative array always output as object: ", json_encode($d), "\n"; 
echo "Associative array always output as object: ", json_encode($d, JSON_FORCE_OBJECT), "\n\n"; 
?> 

Output:

Normal: ["<foo>","'bar'","\"baz\"","&blong&","\u00e9"] 
Tags: ["\u003Cfoo\u003E","'bar'","\"baz\"","&blong&","\u00e9"] 
Apos: ["<foo>","\u0027bar\u0027","\"baz\"","&blong&","\u00e9"] 
Quot: ["<foo>","'bar'","\u0022baz\u0022","&blong&","\u00e9"] 
Amp: ["<foo>","'bar'","\"baz\"","\u0026blong\u0026","\u00e9"] 
Unicode: ["<foo>","'bar'","\"baz\"","&blong&","é"] 
All: ["\u003Cfoo\u003E","\u0027bar\u0027","\u0022baz\u0022","\u0026blong\u0026","é"] 

Empty array output as array: [] 
Empty array output as object: {} 

Non-associative array output as array: [[1,2,3]] 
Non-associative array output as object: {"0":{"0":1,"1":2,"2":3}} 

Associative array always output as object: {"foo":"bar","baz":"long"} 
Associative array always output as object: {"foo":"bar","baz":"long"} 
2

print_r giá trị json_decoded $ nó mang lại cho các mảng rỗng trở lại. :)

$json = json_encode(array()); 
$json_decoded = json_decode($json, true); 


if ($json_decoded == null){ 
    print_r($json_decoded); 
} else 
{ 
    echo "NOT NULL"; 
} 

kết quả đầu ra: Array() Đây là bởi vì với toán tử == mảng trống được gõ juggled null

0

Bạn cần phải sử dụng nghiêm ngặt bình đẳng điều hành ===, quan sát cho chính mình :

$json = json_encode(array()); 
var_dump($json); // string(2) "[]" 
$json_decoded = json_decode($json, true); 
var_dump($json_decoded); // array(0) { } 

Vì vậy, thực hiện:

$json = json_encode(array()); 
$json_decoded = json_decode($json, true); 

if ($json_decoded === null) 
{ 
    echo "NULL"; 
} else 
{ 
    echo "NOT NULL"; 
} 

một cách đúng đắn sẽ đi trong else điều kiện in NOT NULL

0

Nếu dữ liệu của bạn bao gồm một số \n json_decode có thể thất bại âm thầm quá.

Các vấn đề liên quan