json_encode / json_decode - PHP में Array के बजाय stdClass देता है


108

इस छोटी लिपि का निरीक्षण करें:

$array = array('stuff' => 'things');
print_r($array);
//prints - Array ( [stuff] => things )
$arrayEncoded = json_encode($array);
echo $arrayEncoded . "<br />";
//prints - {"stuff":"things"}
$arrayDecoded = json_decode($arrayEncoded);
print_r($arrayDecoded);
//prints - stdClass Object ( [stuff] => things )

PHP JSON ऑब्जेक्ट को एक वर्ग में क्यों बदलता है?

एक सरणी नहीं होनी चाहिए जो json_encodedतब json_decodedउसी परिणाम का उत्पादन करती है?

जवाबों:


145

का दूसरा पैरामीटर को करीब से देख लो json_decode($json, $assoc, $depth)पर https://secure.php.net/json_decode


7
सवाल का जवाब नहीं देता है - एक डिफ़ॉल्ट डिफ़ॉल्ट क्यों है? यह भी देखें stackoverflow.com/questions/3193765/…
विलियम एंट्रीकेन

7
यह वास्तव में इस सवाल का जवाब नहीं देता है, यह सिर्फ एक समाधान प्रदान करता है। लेकिन एक घटिया काम, IMO। क्या होगा यदि आप चाहते हैं कि json- एन्कोडेड ऑब्जेक्ट को ऑब्जेक्ट के रूप में डिकोड किया जाए और json- डीकोडेड साहचर्य सरणियों को साहचर्य सरणियों के रूप में डीकोड किया जाए, स्वचालित रूप से? Json_decode () के लिए दूसरे पैरामीटर का उपयोग करने से मानव हस्तक्षेप का कुछ प्रकार निकलता है। सच कहूँ तो, यह बेकार है (PHP का, इस उत्तर का नहीं)
JDS

@ जेडडीएस आप बहुत आसानी से उन कार्यों को लपेट सकते हैं और अपना खुद का बना सकते हैं जो स्रोत प्रकार को एक कुंजी में स्टोर करता है यदि आपको ज़रूरत है तो पारदर्शी तरीके से।
सिवनी

2
@JDS मैंने एक जवाब जोड़ा है जो वास्तव में "क्यों PHP एक वर्ग में JSON ऑब्जेक्ट को चालू करता है" के सवाल का जवाब देता है।
7ochem

82
$arrayDecoded = json_decode($arrayEncoded, true);

आपको एक सरणी देता है।


2
यह बहुत ही मददगार है, धन्यवाद @Kai Chain - मुझे लगता है कि मूल प्रश्न पूछ रहा था, "क्यों", लेकिन यह वही लगता है जो वे चाहते थे। जो भी हो, मेरी स्थिति के लिए एकदम सही।
घुइल

और यहाँ 4 साल बाद वही काम करता है! बुनियादी ज्ञान है कि हर किसी को वास्तव में मेरी तरह पहले अध्ययन करना चाहिए!
केजेएस

20

वास्तविक प्रश्न का उत्तर देने के लिए:

PHP JSON ऑब्जेक्ट को एक वर्ग में क्यों बदलता है?

एन्कोड किए गए JSON के आउटपुट पर करीब से नज़र डालें, मैंने उदाहरण दिया है कि ओपी थोड़ा कम दे रहा है:

$array = array(
    'stuff' => 'things',
    'things' => array(
        'controller', 'playing card', 'newspaper', 'sand paper', 'monitor', 'tree'
    )
);
$arrayEncoded = json_encode($array);
echo $arrayEncoded;
//prints - {"stuff":"things","things":["controller","playing card","newspaper","sand paper","monitor","tree"]}

JSON प्रारूप जावास्क्रिप्ट ( ECMAScript प्रोग्रामिंग लैंग्वेज स्टैंडर्ड ) के समान मानक से लिया गया था और यदि आप इस प्रारूप को देखेंगे तो यह जावास्क्रिप्ट की तरह दिखेगा। यह एक JSON ऑब्जेक्ट ( {}= ऑब्जेक्ट ) है जिसके पास एक संपत्ति "सामान" है जिसमें मूल्य "चीजें" हैं और एक संपत्ति "चीजें" हैं जिसके साथ यह स्ट्रिंग ( []= सरणी ) का एक मूल्य है ।

JSON (जावास्क्रिप्ट के रूप में) साहचर्य सरणियों को केवल अनुक्रमित सरणियों को नहीं जानता है। इसलिए जब JSON एक PHP साहचर्य सरणी को एन्कोडिंग करता है, तो इसका परिणाम JSON स्ट्रिंग में "सरणी" के रूप में इस सरणी से होगा।

अब हम JSON को फिर से उपयोग करके डिकोड कर रहे हैं json_decode($arrayEncoded)। डीकोड फ़ंक्शन यह नहीं जानता है कि यह JSON स्ट्रिंग कहां से उत्पन्न हुई है (एक PHP सरणी) इसलिए यह एक अज्ञात ऑब्जेक्ट में डिकोडिंग है, जो stdClassPHP में है। जैसा कि आप देखेंगे, स्ट्रिंग्स के "चीजें" सरणी एक अनुक्रमित PHP सरणी में विलीन हो जाएगी।

और देखें:


'चीजों' के लिए https://www.randomlists.com/things का धन्यवाद


2
यह सही उत्तर है ... यह प्रश्न का उत्तर देता है, जबकि अन्य एक अस्पष्टीकृत समस्या के लिए वर्कअराउंड देते हैं। धन्यवाद, मैं हलकों में यह भूल रहा था कि JSON साहचर्य सरणियों का समर्थन नहीं करता है!
मार्कस

5

यद्यपि, जैसा कि उल्लेख किया गया है, आप एक दूसरा पैरामीटर जोड़ सकते हैं ताकि यह इंगित किया जा सके कि आप एक सरणी लौटना चाहते हैं:

$array = json_decode($json, true);

कई लोग इसके बजाय परिणाम डालना पसंद कर सकते हैं:

$array = (array)json_decode($json);

यह पढ़ने के लिए अधिक स्पष्ट हो सकता है।


4
वह अलग अलग है। यदि आपने एक बहुआयामी सरणी या ऑब्जेक्ट को इनकोड किया है, तो अवगत रहें। पहले एक आपको सरणी देता है, दूसरा आपको वस्तुओं का सरणी देता है।
हेक्टर

2

tl; dr: जावास्क्रिप्ट साहचर्य सरणियों का समर्थन नहीं करता है, इसलिए न ही JSON करता है।

आखिरकार, यह JSON है, JSAAN नहीं। :)

इसलिए PHP को JSON में एनकोड करने के लिए अपने एरे को ऑब्जेक्ट में बदलना होगा।


1
    var_dump(json_decode('{"0":0}'));    // output: object(0=>0)
    var_dump(json_decode('[0]'));          //output: [0]

    var_dump(json_decode('{"0":0}', true));//output: [0]
    var_dump(json_decode('[0]', true));    //output: [0]

यदि आप json को सरणी में डिकोड करते हैं, तो इस स्थिति में जानकारी खो जाएगी।


0

इस ब्लॉग पोस्ट में एक अच्छा PHP 4 json encode / decode लाइब्रेरी (जो कि PHP 5 रिवर्स कम्पैटिबल भी है) लिखा है: PHP4 (Jun 2009) में json_encode () और json_decode () का उपयोग करना

ठोस कोड मिशल मिगुर्स्की और मैट कन्नप द्वारा है:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.