2013-10-27 11 views
7

In der PHP-Dokumentation für json_decode heißt es, dass es TRUE, FALSE, NULL zurückgeben kann.Wann gibt PHP json_decode false zurück?

Könnten einige mir helfen zu verstehen, wann es FALSE zurückgeben würde? Ich verstehe, dass ungültiges JSON NULL zurückgibt, aber wann würden die anderen beiden zurückgegeben werden, wenn nicht der tatsächliche JSON-Wert?

Dank

+0

Von dem, was ich sehen kann, würde es nur Rückkehr "TRUE" oder "FALSE", wenn das der tatsächliche dekodierte Wert war. –

+0

es sagt nicht, dass es wahr oder falsch zurückgibt – Markasoftware

+0

"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

Antwort

6

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.

+0

haha ​​... aber ist das der einzige Weg? Ich frage mich, wann es etwas anderes als "NULL" oder den JSON-Wert selbst zurückgeben würde. –

+0

Mit anderen Worten, Sie fragen, wie kann 'false' Wert auf eine andere Weise als als eine Zeichenfolge 'false' codiert werden (case -unempfindlich)? – raina77ow

+0

Ja, das ist meine Frage –

0

Die Dokumentation sagt, dass values true, false and null (case-insensitive) are returned as TRUE, FALSE and NULL respectively. Dies bedeutet, dass, wenn die booleans true oder false im Objekt sind codiert werden, werden sie zeigt als TRUE oder FALSE, und das gleiche für null sein. Zum Beispiel:

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

zurückkehren würde:

["hello",TRUE] 

Es bedeutet nicht, dass json_decode Werte von true zurückkehren, false oder null

+0

Ich habe die Frage gelesen und Sie haben nichts über die falsche Interpretation der Dokumentation gesagt und Sie haben auch nichts dazu gesagt. Mit anderen Worten, du hast meine Antwort grundlos abgelehnt – Markasoftware