2015-11-12 7 views
5

पर ऑब्जेक्ट करने के लिए लेटली मैं एक प्रश्न पर आया जहां किसी ने मुझसे पूछा, मैं json_decode के आउटपुट को एक assoc सरणी में क्यों बदलता हूं।json_decode सरणी या

मेरे लिए stdClasses की तुलना में assoc arrays का उपयोग करना आसान है और पहले से ही कई array_ * फ़ंक्शन हैं जो जेसन स्ट्रिंग को डीकोड करने के बाद डेटा हैंडलिंग का समर्थन करते हैं।

एक लघु प्रदर्शन परीक्षण के बाद यह पता चला है कि एक assoc सरणी में रूपांतरण stdClass के रूपांतरण से लगभग 20% तेज है।

फिर भी, डिफ़ॉल्ट व्यवहार $assoc = false है। तो मुझे आश्चर्य है, जेसन डेटा से निपटने के दौरान stdClasses का उपयोग करने के लाभ थे। क्या कोई जेसन प्रकार हैं जिन्हें assoc arrays में प्रदर्शित नहीं किया जा सकता है, लेकिन stdClasses में?

+0

जब जावास्क्रिप्ट किसी ऑब्जेक्ट को एन्कोड करता है, तो लॉजिकल चीज PHP के लिए ऑब्जेक्ट को डीकोड करने के लिए होगी। यदि कोई सरणी एन्कोड किया गया है, तो आप एक डीकोडेड सरणी की अपेक्षा करते हैं। ऑब्जेक्ट बनाना और शुरू करना हालांकि एक assoc सरणी को संभालने से धीमा लगता है। इस बारे में हमें सूचित करने के लिए धन्यवाद! –

+0

क्या आप हमें अपना मानक दिखा सकते हैं? मैंने PHP 5.6.15 का उपयोग करके https://raw.githubusercontent.com/zemirco/sf-city-lots-json/master/citylots.json के साथ अपना स्वयं का किया और परिणाम शांत बंद थे ... 4% धीमी गति से। – svrnm

+0

@svrnm क्या वे एक साधारण बहुत बड़े पाश और 'माइक्रोटाइम' के साथ थे - लेकिन असली जेएनएस स्ट्रिंग के लिए असली लाभ भिन्न हो सकता है। ऐसे स्ट्रिंग हो सकते हैं जिनमें कम या ज्यादा ओवरहेड हो – Philipp

उत्तर

3

यह राय के आधार पर बंद हो सकता है, लेकिन मेरे लिए, मैं आम तौर पर जो भी डेटा संरचना उपयोग मामले के लिए सबसे अधिक समझ में आता है, उसे डीकोड करता हूं।

{ 
    "title": "Cool Book", 
    "author": "Amazing Author", 
    "publisher": "Evil Corporation", 
    ... 
} 

मुझे उस करने के लिए, एक वस्तु है यह अलग गुणों के साथ एक आइटम है कि में:

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

अब यदि JSON में एक प्रकार का डेटा होता है जो एक शब्दकोश, मानचित्र, हैश टेबल इत्यादि का प्रतिनिधित्व कर सकता है, जहां सभी महत्वपूर्ण मूल्य जोड़े, संक्षेप में, समान आइटम, अलग-अलग लुकअप के साथ, मैप किए गए मान, मैं एक सहयोगी सरणी को डीकोडिंग पर विचार कर सकता हूं। हो सकता है कि का एक अच्छा उदाहरण इस तरह देश का नाम नक्शे के लिए एक देश कोड होगा:

{ 
    "AF": "Afghanistan", 
    "AX": "Aland Islands", 
    "AL": "Albania", 
    "DZ": "Algeria", 
    ... 
} 

मैं एक साहचर्य सरणी को यह डिकोड करने के लिए, क्योंकि मैं इस के किसी भी वस्तु उन्मुख प्रतिनिधित्व की जरूरत नहीं है इच्छुक हो सकता है जानकारी, क्योंकि मैं केवल कुंजी-मूल्य लुकअप के लिए इसका उपयोग कर रहा हूं।

जेएसओएन में प्रतिनिधित्व किए जा सकने वाले अन्य डेटा संरचनाओं के बारे में आपके प्रश्न का उत्तर देने के लिए, आधिकारिक तौर पर जेएसओएन - ऑब्जेक्ट्स और संख्यात्मक रूप से अनुक्रमित सरणी में समर्थित केवल दो डेटा संरचनाएं हैं। यह serialization प्रारूप की जावास्क्रिप्ट-आधारित जड़ों की वजह से है, उदाहरण के लिए, "आउट ऑफ़ द बॉक्स" एसोसिएटिव सरणी की अवधारणा मौजूद नहीं है।

हालांकि आप पाएंगे कि भाषाओं में कई JSON एन्कोडिंग/डिकोडिंग लाइब्रेरी अन्य डेटा संरचनाओं या प्रकारों के लिए समर्थन जोड़ती हैं, आमतौर पर आदिम डेटा प्रकारों के आसपास हैंडलिंग व्यवहार जोड़ती हैं, लेकिन जब तक आप पूरी तरह से समझ नहीं लेते तब तक मैं इस पर भरोसा नहीं करता डेटा संरचनाएं जो पारित होने जा रही हैं और वे उन सभी अनुप्रयोगों में एन्कोड/डीकोड किए जा रहे हैं जो डेटा को पास कर सकते हैं।के रूप में json_encode() प्रलेखन से इस नोट में दिखाया गया

उदाहरण के लिए, पीएचपी कुछ पुरातन के लिए सहायता प्रदान करता है:

नोट: संदर्भ JSON एनकोडर की तरह, json_encode() JSON एक सरल मूल्य है कि उत्पन्न होगा (यानी, न तो ऑब्जेक्ट और न ही सरणी) यदि एक इनपुट मान के रूप में एक स्ट्रिंग, पूर्णांक, फ्लोट या बूलियन दिया जाता है। जबकि अधिकांश डिकोडर्स इन मानों को मान्य JSON के रूप में स्वीकार करेंगे, कुछ के रूप में विनिर्देश इस बिंदु पर संदिग्ध नहीं हैं। संक्षेप में, हमेशा परीक्षण करें कि आपका JSON डिकोडर json_encode() से उत्पन्न आउटपुट को संभाल सकता है।

अंत में, के साथ प्रदर्शन के संबंध में, आप अपने आवेदन के विकास में बिंदु जहां नंबर एक चिंता का विषय निष्पादन समय, मेमोरी उपयोग, आदि के लिए प्रदर्शन का अनुकूलन है करने के लिए मिलता है और आप विश्वास है कि अपेक्षाकृत पर्याप्त लाभ कारण है अगर JSON deserialization (और बाद में डेटा पहुंच) तर्क को अनुकूलित करके बनाया जा सकता है, तो आपको अंततः प्रतिनिधि डेटा के साथ अपने आवेदन का परीक्षण करना चाहिए और देखें कि आपके लिए सबसे अच्छा क्या काम करता है। मेरा अनुमान है कि यह ज्यादातर अनुप्रयोगों के लिए माइक्रो-ऑप्टिमाइज़ेशन के साथ होगा।

0

मुझे लगता है कि कारण है, कि JSON "जावास्क्रिप्ट वस्तु संकेतन" और इसलिए लोगों एक वस्तु की उम्मीद है। यदि आप json.org पर ऑब्जेक्ट को नाम/मान जोड़े के एक असाधारण सेट के रूप में परिभाषित किया गया है और एक सरणी मानों के क्रमबद्ध संग्रह के लिए है, जैसे लोगों को जावास्क्रिप्ट में इसका उपयोग किया जाता है। यह RFC 4627:

"ऑब्जेक्ट" और "सरणी" शब्द जावास्क्रिप्ट के सम्मेलनों से आते हैं।

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