2012-02-01 10 views
6

मैं simplejson.loads() होने में दिलचस्पी रहा हूँ सफलतापूर्वक निम्नलिखित पार्स:क्या सरलजसन को कम सख्त बनाने का कोई तरीका है?

{foo:3} 

यह कह रही है "संपत्ति नाम की उम्मीद" लेकिन वास्तविकता में यह कह रहा है "मैं अपनी संपत्ति के नाम को दोहरे उद्धरण चिह्नों की आवश्यकता होती है" एक JSONDecodeError फेंकता है। यह मेरे उपयोग के मामले के लिए परेशान है, और मैं कम सख्त व्यवहार पसंद करेंगे। मैंने दस्तावेज़ पढ़ लिए हैं, लेकिन अपनी खुद की डिकोडर कक्षा बनाने से परे, मुझे कुछ भी स्पष्ट नहीं दिख रहा है जो इस व्यवहार को बदलता है।

+1

तो क्या आप चाहते हैं कि 'simplejson' कुछ ऐसा स्वीकार करे जो वैध JSON नहीं है? (यह जावास्क्रिप्ट है जहां उद्धरण वैकल्पिक हैं। JSON में वे अनिवार्य हैं।) – millimoose

+0

हाँ, यह वही है जो मैं चाहता हूं। :) – slacy

+0

जो मैं कह रहा था वह है "यह ऐसा कुछ है जिसे आप पहले स्थान पर नहीं चाहते हैं।" – millimoose

उत्तर

10

आप YAML उपयोग कर सकते हैं (> = 1.2) के रूप में यह JSON का सुपरसेट है, तो आप कर सकते हैं:

>>> import yaml 
>>> s = '{foo: 8}' 
>>> yaml.load(s) 
{'foo': 8} 
+0

वाह, यह वही है जो मैं चाहता था। धन्यवाद! – slacy

+1

@ स्लेसी मैंने अभी देखा है कि यम को कोलन के बाद एक जगह चाहिए। मुझे लगता है कि यह आपकी पार्टी को खराब कर देगा। – RanRag

+1

यह तब तक करता है जब तक कि आरएचएस एक सरणी न हो। {foo: [bar]} ठीक है, जो वास्तव में मैं कर रहा हूं। – slacy

1

नहीं, यह संभव नहीं है। सरलजसन का उपयोग करके सफलतापूर्वक विश्लेषण करने के लिए आपको पहले इसे एक वैध JSON स्ट्रिंग में बदलने की आवश्यकता होगी।

आपकी आने वाली स्ट्रिंग का प्रारूप कितना सख्त है यह बहुत सरल या बेहद जटिल हो सकता है।

import re 
your_string = re.sub(r'([a-zA-Z_]+)', r'"\1"', your_string) 
:

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

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

>>> re.sub(r'([a-zA-Z_]+)', r'"\1"', '{foo:3, bar:4}') 
'{"foo":3, "bar":4}' 
2

आप demjson आज़मा सकते हैं।

>>> import demjson 
>>> demjson.decode('{foo:3}') 
{u'foo': 3}