2011-10-16 12 views
6

मैं json का उपयोग कर simplejson.dumps में एक अजगर सरणी एन्कोड करने के लिए कोशिश कर रहा हूँ:Django escapejs और simplejson

In [30]: s1 = ['test', '<script>'] 

In [31]: simplejson.dumps(s1) 
Out[31]: '["test", "<script>"]' 

वर्क्स ठीक।

लेकिन मैं बुला simplejson.dumps से पहले पहली तार से बचने के लिए (Django से escapejs का प्रयोग करके) हैं:

In [35]: s_esc 
Out[35]: [u'test', u'\\u003Cscript\\u003E'] 

In [36]: print simplejson.dumps(s_esc) 
["test", "\\u003Cscript\\u003E"] 

मेरे समस्या है: ["test", "\u003Cscript\u003E"] के बजाय ["test", "\\u003Cscript\\u003E"]

: मैं भाग निकले स्ट्रिंग होना चाहता हूँ

मैं replace उपयोग कर सकते हैं:

In [37]: print simplejson.dumps(s_esc).replace('\\\\', '\\') 
["test", "\u003Cscript\u003E"] 

लेकिन यह एक अच्छा तरीका है? मैं सिर्फ जेसन को एन्कोड करने से पहले तारों से बचना चाहता हूं। इसलिए जब मैं टेम्पलेट में उनका उपयोग करता हूं तो कोई वाक्यविन्यास त्रुटियां नहीं होंगी।

धन्यवाद। :)

उत्तर

8

simplejson 2.1.0 और बाद में JSONEncoderForHTML एन्कोडर शामिल है जो वास्तव में आप चाहते हैं। अपने उदाहरण में इसका इस्तेमाल करने के लिए:

>>> s1 = ['test', '<script>'] 
>>> simplejson.dumps(s1, cls=simplejson.encoder.JSONEncoderForHTML) 
'["test", "\\u003cscript\\u003e"]' 

मैं हाल ही में इस में भाग मैं कोड है कि डेटा संरचनाओं पैदा किया गया था पर नियंत्रण नहीं था जहां, तो जैसा कि इकट्ठे किए जा रहे थे मैं तार से बच नहीं सकता है। JSONEncoderForHTML ने आउटपुट के बिंदु पर अच्छी तरह से समस्या हल की।

बेशक, आपको सरलजन 2.1.0 या बाद में होना आवश्यक होगा। (Django एक पुराने संस्करण के साथ आते थे, और Django 1.5 पूरी तरह से django.utils.simplejson deprecated।) यदि आप किसी कारण से अपग्रेड नहीं कर सकते हैं, तो JSONEncoderForHTML code अपेक्षाकृत छोटा है और शायद पहले कोड में खींचा जा सकता है या Python 2.6+'s json package के साथ उपयोग किया जा सकता है - - हालांकि मैंने यह कोशिश नहीं की है

+0

हां, आप सही जोड़ रहे हैं मेरे लिए काम नहीं किया। मुझे नहीं पता था कि JSONEncoderForHTML है। मेरी मदद करने के लिए बहुत बहुत धन्यवाद। :) – srcastro

0

आप गलत क्रम में परिचालन कर रहे हैं। आपको अपने डेटा को JSON स्ट्रिंग पर डंप करना चाहिए, फिर उस स्ट्रिंग से बचें। आप addslashes Django फ़िल्टर से बच निकल सकते हैं।

+0

आपकी सहायता के लिए बहुत बहुत धन्यवाद। मैं वास्तव में इसकी प्रशंसा करता हूँ। :) – srcastro

+0

मैं जेसन या एचटीएमएल उत्पन्न करने के लिए 'जोड़ों' की सिफारिश नहीं करता - मेरा मानना ​​है कि यह एसक्यूएल प्रीपे के लिए है। 'addlashes' आपके एचटीएमएल में लीकिंग स्ट्रिंग्स में से एक में '' जैसी किसी चीज़ के खिलाफ सुरक्षा नहीं करेगा। मूल प्रश्न 'escapejs' का उल्लेख किया गया है, और यह जावास्क्रिप्ट आउटपुट के लिए उपयोग करने के लिए बिल्कुल सही है। – medmunds