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 {}
và []
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à true
và null
).
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.
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ã. –
nó không nói rằng nó trả về true hoặc false – Markasoftware
"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