2013-10-27 19 views
7

Trong tài liệu PHP cho json_decode nó nói nó có thể trả về TRUE, FALSE, NULL.khi nào php json_decode trả về false?

Một số người có thể giúp tôi hiểu khi nào sẽ trả lại FALSE? Tôi hiểu JSON không hợp lệ sẽ trả về NULL, nhưng khi nào hai số còn lại sẽ được trả lại nếu không phải là giá trị JSON thực tế?

Cảm ơn

+0

Từ những gì tôi có thể thấy, nó sẽ chỉ trở lại 'TRUE' hoặc' FALSE' nếu đó là giá trị thực được giải mã. –

+0

nó không nói rằng nó trả về true hoặc false – Markasoftware

+0

"nếu không phải là giá trị JSON thực tế" Xin lỗi nhưng điều gì khiến bạn tin rằng 'true' hoặc' false' có thể được trả lại trong bất kỳ trường hợp nào khác? – RandomSeed

Trả lời

6

JSON format definition cho thấy rõ ràng tất cả các giá trị có thể và cơ quan đại diện của họ:

Một giá trị có thể là một chuỗi trong dấu ngoặc kép, hoặc một số, hoặc true hoặc false hoặc null, hoặc một đối tượng hoặc một mảng.

Cả hai đối tượng và mảng có cú pháp đặc biệt trong JSON đại diện (bọc trong {}[] tương ứng), vì vậy họ không thể lẫn lộn với false trong mọi trường hợp. Cũng vậy với chuỗi - nó được bọc trong "" (dấu ngoặc kép). Đối với số, chúng phải chứa ít nhất một chữ số - vì vậy không thể nhầm lẫn với false (và truenull).

Vì vậy, để lại cho chúng ta trường hợp duy nhất: khi json_encode xử lý một đối tượng đã định nghĩa lại biểu diễn JSON của nó. Ví dụ (PHP 5.4+):

class FalsyFoo implements JsonSerializable { 
    public $foo; 

    public function __construct($f) { 
    $this->foo = $f; 
    } 

    public function jsonSerialize() { 
    return false; 
    } 
} 

$f = new FalsyFoo(true); 
$fj = json_encode($f); 
var_dump($fj); // string(5) 'false' 
var_dump(json_decode($fj)); // bool(false) 

Về mặt kỹ thuật, chúng tôi vẫn làm việc với false giá trị ở đây, nhưng nguồn gốc rõ ràng là khác nhau.


Nếu bạn vẫn không thuyết phục, kiểm tra the source code của json_decode, trong đó kêu gọi php_json_decode_ex sau khi kiểm tra các đối số. Điều này, lần lượt, các cuộc gọi parse_JSON_ex đầu tiên, hoạt động trên state transition table được xác định trước; cái sau chỉ có một tập hợp các trạng thái dẫn đến giá trị false là kết quả. Nếu cuộc gọi này không thành công bằng cách nào đó, giá trị được kiểm tra directly:

if (str_len == 4) { 
    if (!strcasecmp(str, "null")) { 
    /* We need to explicitly clear the error 
     because its an actual NULL and not an error */ 
    jp->error_code = PHP_JSON_ERROR_NONE; 
    RETVAL_NULL(); 
    } else if (!strcasecmp(str, "true")) { 
    RETVAL_BOOL(1); 
    } 
} else if (str_len == 5 && !strcasecmp(str, "false")) { 
    RETVAL_BOOL(0); 
} 

... và đó là trường hợp duy nhất khi return_value được thiết lập để boolean.

+0

haha ​​... nhưng đây có phải là cách duy nhất không? Tôi tự hỏi khi nào nó sẽ không trả về cái gì khác ngoài 'NULL' hoặc giá trị json tự nó –

+0

Nói cách khác, bạn hỏi làm thế nào giá trị' false' có thể được mã hóa theo bất kỳ cách nào khác hơn là một chuỗi 'false' (trường hợp -vô cảm)? – raina77ow

+0

vâng, đó là câu hỏi của tôi –

0

Các tài liệu nói rằng values true, false and null (case-insensitive) are returned as TRUE, FALSE and NULL respectively. Điều này có nghĩa rằng nếu các phép toán luận true hoặc false là trong đối tượng được mã hóa, họ sẽ có các chương trình như TRUE hoặc FALSE, và tương tự cho null. Ví dụ:

json_decode('["hello",true]'); 

sẽ trở lại:

["hello",TRUE] 

Nó không có nghĩa là json_decode sẽ trở lại giá trị của true, false, hoặc null

+0

tôi đã đọc câu hỏi, và bạn không nói gì về việc giải thích không chính xác tài liệu và bạn cũng không bình luận về nó. Vì vậy, nói cách khác, bạn downvoted câu trả lời của tôi không có lý do – Markasoftware

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