JSON format definition deutlich zeigt alle möglichen Werte und ihre Darstellungen:
Ein Wert ein String in doppelten Anführungszeichen angegeben werden kann, oder eine Zahl oder true
oder false
oder null
oder ein Objekt oder ein Array.
Beiden Objekte und Arrays haben spezielle Syntax in JSON Darstellung (eingewickelt in {}
und []
respectively), so dass sie nicht mit false
auf jedem Fall verwechselt werden. Das gleiche gilt für die Zeichenfolge - sie ist in ""
(doppelte Anführungszeichen) eingeschlossen. Wie für Zahlen müssen sie mindestens eine Ziffer enthalten - so kann nicht mit false
(und true
und null
) auch zu verwechseln sein.
Das lässt uns mit dem einzigen Fall: Wenn json_encode ein Objekt verarbeitet hat seine JSON-Darstellung neu definiert. Zum Beispiel (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)
Technisch wir noch mit false
Wert arbeiten hier, aber die Quelle ist offensichtlich anders.
Wenn Sie immer noch nicht überzeugt, überprüfen the source code von json_decode
, die php_json_decode_ex ruft nach die Argumente zu prüfen. Dies wiederum ruft zuerst parse_JSON_ex auf, das über die vordefinierte state transition table arbeitet; Letzteres hat nur einen Satz von Zuständen, der zu false
als Ergebnis führt. Wenn dieser Aufruf irgendwie fehlschlägt, wird Wert directly geprüft:
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);
}
... und das ist der einzige Fall, wenn return_value eingestellt ist boolean.
Von dem, was ich sehen kann, würde es nur Rückkehr "TRUE" oder "FALSE", wenn das der tatsächliche dekodierte Wert war. –
es sagt nicht, dass es wahr oder falsch zurückgibt – Markasoftware
"wenn nicht der tatsächliche JSON-Wert" Sorry, aber was lässt Sie glauben, dass 'true' oder' false' in jedem anderen Fall zurückgegeben werden könnte? – RandomSeed