2012-02-08 13 views
26

मैं एक JSON ऑब्जेक्ट को पाइथन dict में पार्स करने का प्रयास कर रहा हूं। मैंने ऐसा पहले कभी नहीं किया है। जब मैंने इस विशेष त्रुटि को गुमराह किया, (पहले चार के साथ क्या गलत है?), अन्य पोस्टों ने कहा है कि लोड होने वाली स्ट्रिंग वास्तव में एक JSON स्ट्रिंग नहीं है। मुझे यकीन है कि यह है, हालांकि।पायथन में JSON पार्स करने का प्रयास कर रहा है। ValueError: संपत्ति का नाम

इस मामले में, eval() ठीक काम करता है, लेकिन मुझे आश्चर्य है कि क्या कोई और उचित तरीका है?

नोट: यह स्ट्रिंग सीधे ट्विटर से, पीटीटी उपकरणों के माध्यम से आता है।

>>> import json 
>>> line = '{u\'follow_request_sent\': False, u\'profile_use_background_image\': True, 
     u\'default_profile_image\': False, 
     u\'verified\': False, u\'profile_sidebar_fill_color\': u\'DDEEF6\', 
     u\'profile_text_color\': u\'333333\', u\'listed_count\': 0}' 
>>> json.loads(line) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 326, in loads 
     return _default_decoder.decode(s) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, in decode 
     obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 382, in raw_decode 
     obj, end = self.scan_once(s, idx) 
    ValueError: Expecting property name: line 1 column 1 (char 1) 
+8

यह सिर्फ पायथन वाक्यविन्यास है, जेएसओएन नहीं। सुरक्षित मूल्यांकन – JBernardo

उत्तर

28

यह निश्चित रूप से JSON नहीं है - किसी भी तरह से मुद्रित नहीं है। इसे पहले से ही पाइथन ऑब्जेक्ट में पार्स किया गया है - JSON के पास false होगा, False नहीं, और यूनिकोड के लिए u के रूप में तार नहीं दिखाएगा (सभी JSON तार यूनिकोड हैं)। क्या आप वाकई अपनी जेसन स्ट्रिंग को पहले से ही श्रृंखला में कहीं भी पाइथन ऑब्जेक्ट में नहीं ले रहे हैं, और इस प्रकार इसे json.loads() में लोड करना स्पष्ट रूप से गलत है क्योंकि वास्तव में यह एक स्ट्रिंग नहीं है?

+2

के लिए 'ast.literal_eval' का उपयोग करें, यह बिल्कुल सही था। धन्यवाद। – gabe

27

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

कभी कभी एक भाषा उद्धरण का एक प्रकार है और एक दूसरे से पहचानता है: btw, जावास्क्रिप्ट में json करने के लिए एक स्ट्रिंग पार्स करने में सभी उद्धरण जावास्क्रिप्ट में json में एक स्ट्रिंग पार्स करने में 'प्रारूप

में रहना होगा सभी उद्धरण "प्रारूप है जो वास्तव में तर्क नहीं है में होना जरूरी

उम्मीद है कि आप उपयोग कर सकते हैं समारोह की जगह पायथन के लिए:।।

json.loads(s.replace("\'", '"')); 

आशा है कि यह आप समय मैं इस शिकार खर्च किया है की बचत होगी बग!

+0

यही वह समस्या है जिसका सामना मैंने किया था। धन्यवाद – Alireza

+0

जावास्क्रिप्ट में JSON में उद्धरण के संबंध में आपके उत्तर का हिस्सा थोड़ा विरोधाभासी दिखता है। मैं आगे बढ़ गया और [परीक्षण] (https://jsbin.com/pupayajoni/1/edit?js,console) जावास्क्रिप्ट (क्रोम में) दोनों प्रकारों में। नतीजा यह है कि: आपका तीसरा अनुच्छेद सही है: मानक जावास्क्रिप्ट पार्सर सिंगल कोट्स को स्ट्रिंग शाब्दिक सीमाओं के रूप में अनुमति नहीं देता है। –

+1

बीटीडब्लू [जेएसओएन विनिर्देश] (http://www.json.org) केवल डबल कोट्स में लिपटे तारों की अनुमति देता है, इसलिए यह व्यवहार जावास्क्रिप्ट और पायथन JSON पार्सर्स के लिए विशिष्ट नहीं है। –

7

मुझे यह त्रुटि मिली जब मेरे पास गुणों की सूची के अंत में एक लटकती कॉमा थी। कॉमा की वजह से यह एक और संपत्ति का नाम की उम्मीद कर रहा था लेकिन कोई भी नहीं था।

+1

जेएसओएन पिछली कॉमा की अनुमति नहीं देता है! और एक पूर्ण नो-गो कि json.load आपको केवल 'ValueError देता है: डबल कोट्स में संलग्न संपत्ति का नाम अपेक्षित' – Ufos

0

सुनिश्चित करें कि आपकी JSON फ़ाइल में // (जो गलत तरीके से टिप्पणी करनी चाहिए!) के साथ लाइनें शुरू नहीं होती हैं। मेरे पास ValueError संदेश है और यह मेरी फ़ाइल से // हटा दिए जाने के बाद चला गया है।

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