9

PHP のドキュメントには、 , ,json_decodeを返すことができると書かれています。TRUEFALSENULL

いつ戻るかを理解するのに役立つものはありFALSEますか?無効な JSON が返されることは理解していますNULLが、実際の JSON 値でない場合、他の 2 つはいつ返されますか?

ありがとう

4

2 に答える 2

7

JSON 形式の定義は、すべての可能な値とその表現を明確に示しています。

値は、二重引用符で囲まれた文字列、数値、 またはtrueまたは 、falseまたはnullオブジェクトまたは配列にすることができます。

オブジェクトと配列はどちらも、JSON 表現に特別な構文 (それぞれ と でラップされ{}[]いる) を持っているため、どのような場合でも混同することはできませんfalse。同じことが文字列にも当てはまります - ""(二重引用符) で囲まれています。数字に関しては、少なくとも 1 桁の数字が含まれている必要があるため、false(andtrueおよびnull) と混同することはできません。

つまり、json_encode が JSON 表現を再定義したオブジェクトを処理する場合です。例 (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)

技術的には、falseここでも値を使用しますが、ソースは明らかに異なります。


それでも納得できない場合は、引数を確認した後にphp_json_decode_exを呼び出すのソース コードを確認してください。次に、これは最初にparse_JSON_exを呼び出します。これは、事前定義された状態遷移テーブルを操作します。後者には、結果として価値につながる状態のセットが 1 つしかありません。この呼び出しが何らかの理由で失敗した場合、値は直接チェックされます:json_decodefalse

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);
}

... return_value がブール値に設定されている場合はこれだけです。

于 2013-10-27T23:52:13.297 に答える
0

ドキュメントによると、values true, false and null (case-insensitive) are returned as TRUE, FALSE and NULL respectively.これは、ブール値trueまたはfalseがエンコードされるオブジェクトにある場合、それらはTRUEorとして表示されFALSE、null の場合も同じであることを意味します。例えば:

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

戻ります:

["hello",TRUE]

、、またはjson_decodeの値を返すという意味ではありませんtruefalsenull

于 2013-10-28T00:27:42.057 に答える