पायथन में शब्दकोश के लिए स्ट्रिंग


126

इसलिए मैंने इस पर बहुत समय बिताया है, और यह मुझे ऐसा लगता है कि यह एक साधारण फिक्स होना चाहिए। मैं अपनी साइट पर उपयोगकर्ताओं को पंजीकृत करने के लिए फेसबुक के प्रमाणीकरण का उपयोग करने की कोशिश कर रहा हूं, और मैं इसे सर्वर साइड करने की कोशिश कर रहा हूं। मैं उस बिंदु पर पहुंच गया हूं जहां मुझे अपना टोकन प्राप्त होता है, और जब मैं जाता हूं:

https://graph.facebook.com/me?access_token=MY_ACCESS_TOKEN

मुझे वह जानकारी मिल रही है जिसे मैं एक स्ट्रिंग के रूप में देख रहा हूँ जो इस प्रकार है:

{"id":"123456789","name":"John Doe","first_name":"John","last_name":"Doe","link":"http:\/\/www.facebook.com\/jdoe","gender":"male","email":"jdoe\u0040gmail.com","timezone":-7,"locale":"en_US","verified":true,"updated_time":"2011-01-12T02:43:35+0000"}

ऐसा लगता है कि मुझे dict(string)इस पर उपयोग करने में सक्षम होना चाहिए, लेकिन मुझे यह त्रुटि मिल रही है:

ValueError: dictionary update sequence element #0 has length 1; 2 is required

इसलिए मैंने अचार का उपयोग करने की कोशिश की, लेकिन यह त्रुटि मिली:

KeyError: '{'

मैंने django.serializersइसे क्रमबद्ध करने के लिए उपयोग करने की कोशिश की, लेकिन इसके समान परिणाम थे। कोई विचार? मुझे ऐसा लगता है कि उत्तर को सरल होना है, और मैं सिर्फ बेवकूफ बन रहा हूं। किसी भी मदद के लिए धन्यवाद!


यदि आप स्ट्रिंग को पायथन के रूप में विकसित करना चाहते हैं, तो आपको अपना स्ट्रिंग बदलने की आवश्यकता हो सकती है: "verified":trueजब तक trueपरिभाषित नहीं किया जाता है तब तक विफल रहता है। या आप उपयोग कर सकते हैं "verified":True, या "verified":"true"
मैट कर्टिस

2
@ मैट: मुझे संदेह है कि वह graph.facebook.com के आउटपुट स्वरूप को बदल सकते हैं।
फ्रेड नर्क

@ फ़्रेड: प्रश्न के शीर्षक को देखते हुए ("स्ट्रिंग टू डिक्शनरी टू पायथन"), मुझे लगता है कि वह कॉल करने से पहले इसे पायथन से बदल सकता था ast.literal_eval()। आपका (संशोधित) उत्तर सही है, हालांकि - एक JSON डीसेरलाइज़र एक बेहतर समाधान है।
मैट कर्टिस

1
@MattCurtis: इसे एक मजबूत तरीके से बदलना (ast.literal_eval से पहले) इसे JSON के रूप में पहले स्थान पर रखने की आवश्यकता होगी। मैंने ast.literal_eval का उल्लेख ओपी को तानाशाही (some_string) के साथ करने के लिए सही तरीके के रूप में किया।
फ्रेड नर्क

@ पसंदीदा: मुझे लगता है कि हम सहमत होने के लिए सहमत हैं :-)
मैट कर्टिस

जवाबों:


239

यह डेटा JSON है ! यदि आप पाइथन 2.6+ पर हैं, तो आप बिल्ट-इन jsonमॉड्यूल का उपयोग करके इसे डीरिशियल कर सकते हैं, अन्यथा आप उत्कृष्ट थर्ड-पार्टी simplejsonमॉड्यूल का उपयोग कर सकते हैं ।

import json    # or `import simplejson as json` if on Python < 2.6

json_string = u'{ "id":"123456789", ... }'
obj = json.loads(json_string)    # obj now contains a dict of the data

5
आपने uअपने उदाहरण JSON स्ट्रिंग के सामने क्यों रखा ?
जॉन मैकिन

2
@ जॉन: यह एक यूनिकोड स्ट्रिंग को इंगित करता है । मैंने इसे ज्यादातर आदत से बाहर रखा है, लेकिन संभवत: फेसबुक एपीआई इसमें गैर-एएससीआईआई पात्रों के साथ डेटा वापस दे सकता है; उस स्थिति में, डेटा एन्कोड किया जाएगा (शायद UTF-8 में), और decode()यह एक unicodeस्ट्रिंग प्राप्त करेगा - जो कि मैंने अपने उदाहरण में उपयोग किया है। इसके अलावा, इस पृष्ठ में JSON का हमेशा यूनिकोड (कार्यकाल के लिए खोज, यह लगभग आधा नीचे है) का उल्लेख है
कैमरून

3
यह पायथन में एक छोटे-यू यूनिकोड शाब्दिक को इंगित करता है। आदत कोई अच्छा कारण नहीं है। "JSON टेक्स्ट का कैरेक्टर एन्कोडिंग हमेशा यूनिकोड है।" - [यूयू] निकोड एनकोडिंग नहीं है। क्या json.loads () को उम्मीद है कि आपको "ओवर द वायर" मिला है, जो आमतौर पर एएससीआईआई में एन्कोडेड एक स्ट्रैट ऑब्जेक्ट है। एक ही मामला है जहाँ आप json.loads () को एक यूनिकोड ऑब्जेक्ट जानबूझकर खिलाएंगे, जहाँ कुछ अजीब व्यक्ति ने इसे UTF-16 में प्रेषित किया था और दस्तावेज के रूप में आपको इसे स्वयं डिकोड करने की आवश्यकता थी।
जॉन मैकिन

1
@ जॉन: हाँ, छोटा-यू unicodeपाइथन प्रकार है, जिसमें एक यूनिकोड (बड़ा-यू उचित संज्ञा) स्ट्रिंग होता है। मैं इस बात से भी सहमत हूं कि यूनिकोड एक एन्कोडिंग में नहीं है, इसलिए शायद मुझे उस पेज को संदर्भ के रूप में इंगित नहीं करना चाहिए। हालांकि, पासिंग unicodeस्ट्रिंग्स से बचने का कोई कारण नहीं है json.loads, हालांकि - डॉक्स स्पष्ट रूप से बताता है कि यह पूरी तरह से स्वीकार्य है, और मुझे पूर्व-डिकोडेड स्ट्रिंग का उपयोग करना पसंद है क्योंकि यह अधिक स्पष्ट है।
कैमरून

8
@ जॉन: पांडित्यपूर्ण होने के लिए क्षमा करें, लेकिन ASCII में एन्कोड किए गए ऑब्जेक्ट की json.loads()अपेक्षा नहीं करता है str- यह उम्मीद करता है कि या तो UTF-8str में एन्कोड की गई कोई ऑब्जेक्ट या ऑब्जेक्ट (या ऑब्जेक्ट प्लस ए क्लियर एन्कोडिंग)unicodestr
कैमरन

19

पायथन शाब्दिक का मूल्यांकन करने के लिए ast.literal_eval का उपयोग करें । हालाँकि, आपके पास JSON है (उदाहरण के लिए "सही" नोट करें), इसलिए JSON डेज़राइज़र का उपयोग करें।

>>> import json
>>> s = """{"id":"123456789","name":"John Doe","first_name":"John","last_name":"Doe","link":"http:\/\/www.facebook.com\/jdoe","gender":"male","email":"jdoe\u0040gmail.com","timezone":-7,"locale":"en_US","verified":true,"updated_time":"2011-01-12T02:43:35+0000"}"""
>>> json.loads(s)
{u'first_name': u'John', u'last_name': u'Doe', u'verified': True, u'name': u'John Doe', u'locale': u'en_US', u'gender': u'male', u'email': u'jdoe@gmail.com', u'link': u'http://www.facebook.com/jdoe', u'timezone': -7, u'updated_time': u'2011-01-12T02:43:35+0000', u'id': u'123456789'}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.