PHP के साथ JSON में एक खाली ऑब्जेक्ट बनाने का सबसे अच्छा तरीका है?


92

एक खाली JSON ऑब्जेक्ट बनाने के लिए जिसका मैं आमतौर पर उपयोग करता हूं:

json_encode((object) null);

किसी वस्तु के काम करने के लिए अशक्त करना, लेकिन क्या इस समाधान के साथ कोई और बेहतर तरीका और / या कोई समस्या है?


आप nSON को JSON ऑब्जेक्ट में क्यों परिवर्तित करेंगे? इसके अलावा, अंतिम परिणाम {} नहीं होगा? तुम बस इतना कर सकते थे।
अयमान सफादी

1
(वस्तु) (सरणी ()) हो सकता है? आपका समाधान अच्छा लगता है।
malletjo

1
json_encode()एक वस्तु नहीं, एक स्ट्रिंग लौटाता है। यह क्यों? क्या मुझसे कोई चूक हो रही है?
टेल्मो मैक्सेस

2
वास्तव में "{}" एक स्ट्रिंग के रूप में सामने आता है! मुझे एक परिणाम चाहिए जैसे: {"some_property": {}} जो एक खाली json ऑब्जेक्ट है। मैं एक अशक्त वस्तु को कारण के रूप में परिवर्तित करता हूं क्योंकि मुझे अब इसके लिए कोई समाधान नहीं पता है;)
pna

मुझे आपका समाधान 8 पसंद है]
एंड्रयू

जवाबों:


111

आपका समाधान काम कर सकता है ।।

प्रलेखन निर्दिष्ट करता है कि (object) nullएक खाली वस्तु में परिणाम होगा, कुछ कह सकते हैं कि आपका कोड वैध है और यह उपयोग करने की विधि है।

PHP: ऑब्जेक्ट्स - मैनुअल

यदि किसी अन्य प्रकार के मान को ऑब्जेक्ट में परिवर्तित किया जाता है, तो अंतर्निहित क्लास में एक नया उदाहरण बनाया जाता है। यदि मान NULL था, तो नया उदाहरण रिक्त होगा।


.. लेकिन, इसे सुरक्षित रखने का प्रयास करें!

यद्यपि आप कभी नहीं जानते कि कब / यदि उपरोक्त परिवर्तन होगा, इसलिए यदि आप 100% निश्चित होना चाहते हैं, तो आप हमेशा {}अपने एन्कोडेड डेटा में एक के साथ समाप्त हो जाएंगे, जैसे कि आप एक हैक का उपयोग कर सकते हैं:

json_encode (json_decode ("{}"));

भले ही यह थकाऊ और बदसूरत हो, लेकिन मुझे लगता है कि मुझे आशा है / उम्मीद है कि json_encode / json_decode एक और दूसरे के साथ संगत है और हमेशा सच करने के लिए निम्नलिखित को विकसित करेगा:

$a = <something>;

$a === json_decode (json_encode ($a)); 

अनुशंसित विधि

json_decode ("{}")stdClassप्रति डिफ़ॉल्ट लौटाएगा , नीचे का उपयोग करके इसे सुरक्षित माना जाना चाहिए। हालांकि, जैसा कि उल्लेख किया गया है, यह बहुत ही समान है (object) null

json_encode (new stdClass);

1
"नया ArrayObject ()" या "(ऑब्जेक्ट) अशक्त" i> => "ऑब्जेक्ट" का उपयोग करने के बाद और प्रतिक्रिया के रूप में '{}' नहीं। php का उपयोग 5.6.29।
रोहितम

81

यदि आप वस्तुओं को गतिशील शब्दकोशों के रूप में उपयोग करते हैं (और मुझे लगता है कि आप करते हैं), तो मुझे लगता है कि आप एक ArrayObject का उपयोग करना चाहते हैं ।

यह खाली होने पर भी JSON शब्दकोश में मैप करता है। यह बहुत अच्छा है अगर आपको सूचियों (सरणियों) और शब्दकोशों (साहचर्य सरणियों) के बीच अंतर करने की आवश्यकता है:

$complex = array('list' => array(), 'dict' => new ArrayObject());
print json_encode($complex); // -> {"list":[],"dict":{}}

आप इसे मूल रूप से जोड़ तोड़ भी कर सकते हैं (जैसा कि आप एक सहयोगी सरणी के साथ करेंगे), और यह एक शब्दकोश में ठीक से प्रस्तुत करता रहेगा:

$complex['dict']['a'] = 123;
print json_encode($complex); // -> {"list":[],"dict":{"a":123}}

unset($complex['dict']['a']);
print json_encode($complex); // -> {"list":[],"dict":{}}

यदि आपको दोनों तरीकों से 100% संगत होने की आवश्यकता है , तो आप इसे लपेट भी सकते हैं json_decodeताकि यह वस्तुओं के ArrayObjectsबजाय वापस आ जाए stdClass(आपको परिणाम पेड़ पर चलना होगा और सभी वस्तुओं को पुन: प्रतिस्थापित करना होगा, जो काफी आसान काम है)।

गोचर । केवल एक मैंने अब तक पाया है: का is_array(new ArrayObject())मूल्यांकन करता है false। आपको is_arrayघटनाओं को खोजने और बदलने की आवश्यकता है is_iterable


5
यह यहां सबसे सही उत्तर है, यह ठीक इसी मामले में आवश्यक है
Avi Kapuya

2
धन्यवाद, यह सबसे अच्छा जवाब है और बिल्कुल मेरी जरूरतों के अनुरूप है। इसे पढ़ने से पहले, मेरा कोड शुरू हुआ jsonResponse = array()और फिर इसे गतिशील रूप से एक लूप द्वारा भरा गया। यदि लूप में एक एकल पुनरावृत्ति नहीं होती थी तो "खाली" ऑब्जेक्ट (या शब्दकोश, जैसा कि आप इसे कहते हैं) को एन्कोड किया गया था, []जबकि अन्य सभी मामलों को "{attr_1: value1, ...} . All the other answers around here have a flaw. They assume that one already knows if the dictionary is empty or not in advance. Especially the answer that tells one should simply write $ json = {}` के रूप में एन्कोड किया गया था। json_encode का उपयोग बिल्कुल भी व्यर्थ न करें।
user2690527

पकड़ लिया लागू नहीं करना चाहिए - के बाद से ArrayObjectलागू करता iterableहै, तो आप दोनों कर सकता है is_iterable($foo)और साथ ही का उपयोग iterableकरने के बजाय प्रकार संकेत arrayहै, जो तुम वैसे भी करना चाहिए खुद के उदाहरण पारित करने के लिए विकल्प छोड़ने के लिए ArrayAccessउदाहरण के लिए,।
मोरित्ज़ फ्रेडरिक

ठंडा! उत्तर अपडेट किया गया।
व्रजियल नोव

17

ठीक है, json_encode()बस एक PHP सरणी / वस्तु / आदि से एक स्ट्रिंग लौटाता है। आप एक ही प्रभाव को अधिक कुशलता से प्राप्त कर सकते हैं:

$json = '{}';

इसे पूरा करने के लिए किसी फ़ंक्शन का उपयोग करने का वास्तव में कोई मतलब नहीं है।

अद्यतन अपनी टिप्पणी के अनुसार, आप कोशिश कर सकते हैं:

$test = json_encode(array('some_properties'=>new stdClass));

हालांकि मुझे यकीन नहीं है कि आप जो भी कर रहे हैं, उससे बेहतर है।


1
नहींं, कि अंदर कुछ कोष्ठक के साथ एक स्ट्रिंग है, मैं कुछ हासिल करना चाहता हूं: {"some_properties": {}} ... नहीं {"some_properties": "{}"} जो अलग है।
पन्ना

ओह शिट, बहुत समय बिताया मेरी पोस्ट लिखने में .. 8 मिनट बहुत देर हो गई!
फिलिप रोसेन -

@refp Haha कठिन को विश्वकोश उत्तर के साथ प्रतिस्पर्धा करने के लिए :)
rdlowrey

hehe सॉरी rdlowrey लेकिन @refp बहुत थकाऊ था;)
pna

9

PHP के साथ JSON में एक खाली ऑब्जेक्ट बनाने के लिए मैंने उपयोग किया

$json=json_decode('{}');
$json->status=202;
$json->message='Accepted';
print_r($json);

जिसका उत्पादन किया गया

stdClass Object
(
    [status] => 202
    [message] => Accepted
)

जो आवश्यक है, क्योंकि बाद में मुझे ऐसा करना होगा

if(is_object($json))

5

मैं हमेशा करता हूं (Object)[];, जैसे:

$json = (Object)[]; // [] could also be array()

... इसके साथ PHP में खेलते हैं ...

$json = json_encode($json);

... अब यह असली JSON है ...


2

json_encode($array, JSON_FORCE_OBJECT)यह भी करेंगे। देख https://www.php.net/manual/en/function.json-encode.php


धन्यवाद ... लेकिन, ध्यान रखें कि यह समाधान गैर-अनुक्रमित सरणी को कुंजी मूल्य जोड़े के साथ ऑब्जेक्ट में परिवर्तित करता है। जैसे: json_encode(['a', 'b'], JSON_FORCE_OBJECT)वापसी होगी{"0": "a", "1": "b"}
फेंडी सेतियावान

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