2012-02-15 11 views
35

मैं इस तरह एक स्ट्रिंग है:अजगर json.loads `ValueError के साथ विफल: अमान्य नियंत्रण चरित्र पर: पंक्ति 1 स्तंभ 33 (चार 33)`

s = u"""{"desc": "\u73cd\u54c1\u7f51-\u5168\u7403\u6f6e\u6d41\u5962\u54c1\u7f51\u7edc\u96f6\u552e\u5546 <br \/>\r\nhttp:\/\/www.zhenpin.com\/ <br \/>\r\n<br \/>\r\n200\u591a\u4e2a\u56fd\u9645\u4e00\u7ebf\u54c1\u724c\uff0c\u9876\u7ea7\u4e70\u624b\u5168\u7403\u91c7\u8d2d\uff0c100%\u6b63\u54c1\u4fdd\u969c\uff0c7\u5929\u65e0\u6761\u2026"}""" 

json.loads(s) रिटर्न इस तरह त्रुटि संदेश:

ValueError: Invalid control character at: line 1 column 33 (char 33) 

यह त्रुटि क्यों होती है? इस समस्या का समाधान किस प्रकार से किया जा सकता है?

+3

में [json.loads (jsonstring) के संभावित डुप्लिकेट पाइथन विफल रहता है यदि स्ट्रिंग में "\ r" यानी कैरिज रिटर्न कैरेक्टर है) (http://stackoverflow.com/questions/8324169/json-loadsjsonstring-in-python-fails-if-string-has-arie-carriage-return) – Kimvais

उत्तर

49

समस्या अपने यूनिकोड स्ट्रिंग कैरिएज रिटर्न (\r) और नई-पंक्तियों (\n) एक स्ट्रिंग JSON डेटा में शाब्दिक भीतर होता है। अगर वे स्वयं स्ट्रिंग का हिस्सा बनने के लिए थे, तो उन्हें उचित रूप से बच जाना चाहिए। अगर वे स्ट्रिंग का हिस्सा नहीं थे, तो वे आपके JSON में भी नहीं होना चाहिए।

यदि आप ठीक नहीं कर सकते जहाँ आप इस JSON स्ट्रिंग मिला मान्य JSON उत्पादन करने के लिए, आप या तो हमलावर वर्ण निकालने सकता है:

>>> json.loads(s.replace('\r\n', '')) 

या उन्हें मैन्युअल भागने:

>>> json.loads(s.replace('\r\n', '\\r\\n')) 
7

से बचने के लिए प्रयास करें अपने \n और \r:

s = s.replace('\r', '\\r').replace('\n', '\\n') 
json.loads(s) 
>>> {u'desc': u'\u73cd\u54c1\u7f51-\u5168\u7403\u6f6e\u6d41\u5962\u54c1\u7f51\u7edc\u96f6\u552e\u5546 <br />\r\nhttp://www.zhenpin.com/ <br />\r\n<br />\r\n200\u591a\u4e2a\u56fd\u9645\u4e00\u7ebf\u54c1\u724c\uff0c\u9876\u7ea7\u4e70\u624b\u5168\u7403\u91c7\u8d2d\uff0c100%\u6b63\u54c1\u4fdd\u969c\uff0c7\u5929\u65e0\u6761\u2026'} 
+0

यह मुझे किसी अन्य साइट के एपीआई से जो मिला है, उसका हिस्सा है, मुझे नहीं पता कि अन्य अमान्य चरित्र हैं या नहीं। क्या आप अन्य अमान्य पात्रों को जानते हैं? –

10

समस्या यह है कि इंडेक्स 33 का चरित्र कैरिज रिटर्न कंट्रोल कैरेक्टर है।

>>> s[33] 
u'\r' 

JSON कल्पना के अनुसार, मान्य वर्ण हैं:

  • को छोड़कर किसी भी यूनिकोड वर्ण: ", \, और नियंत्रण-वर्ण (ord(char) < 32)।

  • निम्नलिखित चरित्र दृश्यों अनुमति दी जाती है: \", \\, \/, \b (बैकस्पेस), \f (फार्म फ़ीड), \n (लाइन फ़ीड/नई लाइन), \r (गाड़ी वापसी), \t (टैब) , या \u के बाद चार हेक्साडेसिमल अंक।

हालांकि, पायथन में आप डबल बच नियंत्रण वर्ण के लिए करने जा रहे हैं (जब तक स्ट्रिंग कच्चे है), क्योंकि अजगर उन लोगों को भी नियंत्रण वर्ण व्याख्या करता है।

>>> s = ur"""{"desc": "\u73cd\u54c1\u7f51-\u5168\u7403\u6f6e\u6d41\u5962\u54c1\u7f51\u7edc\u96f6\u552e\u5546 <br \/>\r\nhttp:\/\/www.zhenpin.com\/ <br \/>\r\n<br \/>\r\n200\u591a\u4e2a\u56fd\u9645\u4e00\u7ebf\u54c1\u724c\uff0c\u9876\u7ea7\u4e70\u624b\u5168\u7403\u91c7\u8d2d\uff0c100%\u6b63\u54c1\u4fdd\u969c\uff0c7\u5929\u65e0\u6761\u2026"}""" 
>>> json.loads(s) 
{u'desc': u'\u73cd\u54c1\u7f51-\u5168\u7403\u6f6e\u6d41\u5962\u54c1\u7f51\u7edc\u96f6\u552e\u5546 <br />\r\nhttp://www.zhenpin.com/ <br />\r\n<br />\r\n200\u591a\u4e2a\u56fd\u9645\u4e00\u7ebf\u54c1\u724c\uff0c\u9876\u7ea7\u4e70\u624b\u5168\u7403\u91c7\u8d2d\uff0c100%\u6b63\u54c1\u4fdd\u969c\uff0c7\u5929\u65e0\u6761\u2026'} 

संदर्भ:

+1

क्या होगा यदि स्ट्रिंग एक चर में है? उदाहरण के लिए, मैं एक HTTP POST के माध्यम से एक JSON ऑब्जेक्ट प्राप्त कर रहा हूं: '{" टेक्स्ट ":" हैलो, \ n आप कैसे हैं? "}'। मैं स्पष्ट रूप से इस से कच्ची स्ट्रिंग बनाने के लिए 'r''' का उपयोग नहीं कर सकता। मैं पाइथन से इसका इलाज कैसे कर सकता हूं, या यह बहुत देर हो चुकी है और अब मुझे कुछ प्रकार के स्ट्रिंग प्रतिस्थापन का उपयोग करने की आवश्यकता है? – orokusaki

+0

@orokusaki यदि आपके द्वारा प्राप्त किए जा रहे JSON में उचित वर्ण अनुक्रमों के बजाय शाब्दिक नियंत्रण वर्ण हैं, तो वास्तव में बहुत देर हो चुकी है क्योंकि JSON ठीक से उत्पन्न नहीं हुआ था। इसलिए यदि आप प्रारंभिक पीढ़ी को नियंत्रित नहीं कर सकते हैं तो आपको पायथन में कुछ स्ट्रिंग प्रतिस्थापन करना होगा। – cpburnz

+0

उत्तर के लिए धन्यवाद। मैं बस 'सख्त = झूठी' को 'लोड' करने के लिए पास हो गया, जो मुझे लगा कि एक क्लीनर समाधान हो सकता है - हम देखेंगे कि यह मुझे काटने के लिए वापस आता है:/ – orokusaki

70

एक अन्य विकल्प, शायद, strict=False तर्क

उपयोग करने के लिए http://docs.python.org/2/library/json.html

के अनुसार, "अगर सख्त गलत है (है सच डिफ़ॉल्ट है), फिर स्ट्रिंग के अंदर वर्णों को नियंत्रित करने की अनुमति दी जाएगी। इस संदर्भ में नियंत्रण वर्ण 0-31 रेंज में वर्ण कोड वाले हैं, जिनमें '\ t' (टैब), '\ n', '\ r' और '\ 0' शामिल हैं। "

उदाहरण के लिए:

json.loads(json_str, strict=False) 
0

कुछ मामलों में, इस त्रुटि बढ़ा दी जाएगी जब फ़ाइल वास्तव में उस में एक सफेद स्थान के साथ एक स्ट्रिंग है। खाली स्थान के हटाया जा रहा है समस्या का समाधान होगा।

+0

यह प्रश्न का उत्तर नहीं देता है। किसी लेखक से स्पष्टीकरण की आलोचना करने या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें - आप हमेशा अपनी पोस्ट पर टिप्पणी कर सकते हैं, और एक बार आपके पास पर्याप्त [प्रतिष्ठा] (http://stackoverflow.com/help/whats-reputation) हो [किसी भी पोस्ट पर टिप्पणी करने में सक्षम] [http://stackoverflow.com/help/privileges/comment)। – Mathias

+0

अभी तक टिप्पणी नहीं कर सकता .... क्षमा करें – sheldonkreger

+0

अपनी verbiage को फिर से लिखने का प्रयास करें, जो इसके वर्तमान रूप में एक टिप्पणी होने के लिए अधिक अनुकूल है, और इसे उत्तर के रूप में गद्य है। वर्णन करें कि आप क्या मानते हैं और आपका अनुशंसित समाधान है। –

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