2013-10-27 13 views
7

json_decode के लिए PHP दस्तावेज़ में यह कहता है कि यह TRUE, FALSE, NULL वापस कर सकता है।php json_decode झूठी वापसी कब करता है?

क्या कुछ मुझे समझने में मदद कर सकता है कि यह FALSE वापस कब आएगा? मैं समझता हूं कि अवैध JSON NULL लौटाएगा, लेकिन वास्तविक JSON मान नहीं होने पर अन्य दो कब वापस आएंगे?

धन्यवाद

+0

से के मूल्यों वापस आ जाएगी कि मैं क्या देख सकते हैं, यह केवल वापस होगा 'सत्य' या 'गलत' यदि वह वास्तविक मान डीकोड किया गया था। –

+0

यह नहीं कहता कि यह सच या गलत – Markasoftware

+0

"वास्तविक JSON मान नहीं है" क्षमा करें, लेकिन आपको किसी अन्य मामले में 'सत्य' या 'झूठी' वापस क्या माना जा सकता है? – RandomSeed

उत्तर

6

JSON format definition स्पष्ट रूप से सभी संभावित मान और उनके अभ्यावेदन पता चलता है:

एक मूल्य दोहरे उद्धरण में एक स्ट्रिंग, या एक नंबर, या true या false या null, या किसी वस्तु हो सकता है या एक सरणी।

दोनों वस्तुओं और सरणियों JSON प्रतिनिधित्व ({} और [] क्रमशः में लिपटे) में विशेष सिंटेक्स है, इसलिए वे किसी भी मामले में false के साथ नहीं मिलाया जा सकता। स्ट्रिंग के साथ ही यह जाता है - यह "" (डबल उद्धरण चिह्न) में लपेटा गया है। संख्याओं के लिए, उन्हें कम से कम एक अंक होना चाहिए - इसलिए false (और true और 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 मूल्य के साथ काम करते हैं, लेकिन स्रोत स्पष्ट रूप से अलग है।


आप अभी भी आश्वस्त नहीं कर रहे हैं, की जाँच json_decode, जो तर्क की जाँच के बाद php_json_decode_ex कॉल की the source code। यह बदले में, parse_JSON_ex पहले कॉल करता है, जो पूर्वनिर्धारित state transition table पर संचालित होता है; उत्तरार्द्ध में राज्यों का केवल एक सेट है जिसके परिणामस्वरूप false मूल्य होता है। इस कॉल के किसी भी तरह विफल रहता है, मूल्य 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); 
} 

... और है कि केवल मामला है जब return_value बूलियन पर सेट किया जाता है।

+0

हाहा ... लेकिन क्या यह एकमात्र तरीका है? मैं सोच रहा हूं कि यह 'न्यूल' या जेसन मूल्य के अलावा कुछ और वापस नहीं करेगा –

+0

दूसरे शब्दों में, आप पूछ रहे हैं कि 'झूठी' मान किसी अन्य तरीके से 'झूठी' (केस 'के रूप में कैसे एन्कोड किया जा सकता है -insensitive)? – raina77ow

+0

हाँ, यह मेरा प्रश्न है –

0

प्रलेखन का कहना है कि values true, false and null (case-insensitive) are returned as TRUE, FALSE and NULL respectively. इसका मतलब यह है कि अगर बूलियन्स true या false वस्तु में हैं एन्कोड करने की, वे TRUE या FALSE, और अशक्त के लिए एक ही रूप में दिखाया जाता हो जाएगा। उदाहरण के लिए:

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

वापसी होगी:

["hello",TRUE] 

यह मतलब नहीं है कि json_decodetrue, false, या null

+0

मैंने सवाल पढ़ा, और आपने दस्तावेज़ों को गलत तरीके से व्याख्या करने के बारे में कुछ नहीं कहा और आपने इसके बारे में कोई टिप्पणी नहीं की। तो, दूसरे शब्दों में, आपने बिना किसी कारण के मेरे जवाब को कम कर दिया – Markasoftware

संबंधित मुद्दे