2012-04-18 19 views
8

मुझे समस्या है जब मैं जेसन स्ट्रिंग को पायथन शब्दकोश में कनवर्ट करना चाहता हूं। मैं स्ट्रिंग की तरहjson string को शब्दकोश में कैसे परिवर्तित करें और कुंजी में क्रम को सुरक्षित करें?

s={"name":{"Saban:Saulic"},"price":{"koncert:1000"} ....} 

जब मैं की तरह

tags=json.loads(s) 

मैं शब्दकोश gtet लेकिन चाबियों का आदेश स्ट्रिंग में की तरह समान नहीं है (इसे नाम नहीं है, कीमत ...) कुछ लिखना है। Json स्ट्रिंग को शब्दकोश में कैसे परिवर्तित करें और कुंजी में ऑर्डर सहेजें?

+2

शब्दकोशों अव्यवस्थित कर रहे हैं, जो ठीक है क्योंकि आम तौर पर आप प्रविष्टियों * का उपयोग कुंजी द्वारा * और आप तत्वों से अधिक पुनरावृति करने के लिए है, आदेश आमतौर पर कोई फर्क नहीं पड़ता। बीटीडब्ल्यू, 'एस' न तो एक स्ट्रिंग है और न ही एक शब्दकोष वैध JSON है यदि यह एक स्ट्रिंग था। ऐसा लगता है कि आप एक अलग संरचना के बाद हैं, जैसे वस्तुओं की सरणी: '[{" नाम ":" ... "," मूल्य ":" ... "}, ...]'। यदि आप * क्यों * के लिए कुछ स्पष्टीकरण प्रदान करते हैं तो आपको क्रम में चाबियाँ चाहिए और एक सही उदाहरण प्रदान करें, तो हम आपकी मदद कर सकते हैं। –

+0

'dict 'में' कुंजी का क्रम" वास्तव में ऐसी कोई चीज़ नहीं है। आप एक समय में उन पर एक बार फिर से शुरू कर सकते हैं, लेकिन आप किस क्रम में उन्हें प्राप्त करते हैं, इस पर कोई नियंत्रण नहीं है। –

+3

मुझे लगता है [यह पिछला] (http: // stackoverflow।कॉम/प्रश्न/692169 9/कैन-आई-गेट-जेसन-टू-लोड-इन-ऑर्डर-ऑर्डर-इन-पायथन) स्टैक ओवरफ्लो पर प्रश्न यहां एक उत्तर प्रदान करता है। – Alvin

उत्तर

21

Python 2.7 जब से तुम शब्दकोश इस तरह तत्वों की प्रविष्टि आदेश को बरकरार रखता है से collections

OrderedDict मॉड्यूल है।

अजगर डॉक्स से:

json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

deserialize fp (एक .read() - फ़ाइल की तरह एक JSON दस्तावेज़ वाली वस्तु का समर्थन) एक अजगर ऑब्जेक्ट के लिए।

fp की सामग्री को एक ASCII आधारित अन्य UTF-8 से एन्कोडिंग के साथ इनकोडिंग रहे हैं (उदा लैटिन -1), तो एक उचित एन्कोडिंग नाम निर्दिष्ट किया जाना चाहिए। एन्कोडिंग जो ASCII आधारित नहीं हैं (जैसे कि यूसीएस -2) की अनुमति नहीं है, और कोडेक्स.getreader (एन्कोडिंग) (एफपी), या के साथ लपेटा जाना चाहिए, बस एक यूनिकोड ऑब्जेक्ट को डीकोड किया गया है और लोड() पर पास किया गया है।

object_hook एक वैकल्पिक फ़ंक्शन है जिसे किसी भी ऑब्जेक्ट का शाब्दिक डीकोडेड (एक dict) के परिणाम के साथ बुलाया जाएगा। ऑब्जेक्ट_हूक का वापसी मूल्य dict के बजाय उपयोग किया जाएगा। कस्टम डिकोडर्स को लागू करने के लिए इस सुविधा का उपयोग (उदा। JSON-RPC क्लास संकेत) का उपयोग किया जा सकता है।

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

मैं तुम्हारे साथ पैरामीटर object_pairs_hook इस्तेमाल कर सकते हैं लगता है collections.OrderedDict()

tags=json.loads(s, object_pairs_hook=collections.OrderedDict) 
अजगर
संबंधित मुद्दे