2011-10-16 10 views
6

Ben json kullanarak simplejson.dumps içine bir Python dizi kodlamak çalışıyorum:django escapejs ve simplejson

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

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

İşleri cezası.

Ama çağırmadan simplejson.dumps önce (Django dan escapejs kullanarak) ilk dizeleri kaçmak istiyorum:

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

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

Benim sorundur: ["test", "\u003Cscript\u003E"] yerine

["test", "\\u003Cscript\\u003E"] ait: Kaçtım dize olmak istiyorum

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

Ama bu iyi bir yaklaşımdır:

Ben replace kullanabilir? Sadece dizeleri ilk önce json'a kodlamaktan kaçmak istiyorum. Yani bunları şablonda kullandığımda hiçbir sözdizimi hatası olmayacaktır.

Teşekkürler. :)

cevap

8

simplejson 2.1.0 ve üstü, tam olarak istediğiniz şeyi yapan bir JSONEncoderForHTML kodlayıcı içerir. Ben veri yapılarını üreten koda üzerinde kontrol yoktu nerede

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

Geçenlerde bu karşılaştım, bu yüzden monte ediliyordu gibi dizeleri kurtulamamıştır: sizin örnekte bunu kullanın. JSONEncoderForHTML sorunu çıktı noktasında düzgün bir şekilde çözdü.

Tabii ki, 2.1.0 veya sonraki sürümlerde kullanmanız gerekecek. (Django eski bir sürümle birlikte gelirdi ve Django 1.5 tamamen django.utils.simplejson'u kullanmayı reddetti.) Bazı nedenlerle yükseltme yapamıyorsanız, JSONEncoderForHTML code nispeten küçüktür ve muhtemelen daha önceki kodlara çekilebilir veya Python 2.6+'s json package ile birlikte kullanılabilir - - Bunu kendim denemesem de

+0

Evet, sen haklısın, benim için işe yaramadı. JSONEncoderForHTML olduğunu bilmiyordum. Bana yardım ettiğiniz için çok teşekkür ederim. :) – srcastro

0

İşlemleri yanlış sırada yapıyorsunuz. Verilerinizi bir JSON dizesine bırakmanız ve ardından bu dizeden kurtulmanız gerekir. Kaçış işlemini addslashes Django filtresiyle yapabilirsiniz.

+0

Yardımlarınız için çok teşekkür ederim. Gerçekten onu takdir ederim. :) – srcastro

+0

Ben json veya html oluşturmak için addslashes 'tavsiye etmem - Ben SQL hazırlık için kastediyorum. addslash'lar, htmlinize sızan dizelerinizden birinde '' gibi bir şeye karşı koruma sağlamaz. Özgün soru, 'escapejs' denilen ve bu tam olarak JavaScript çıktısı için kullanmak için doğru kaçış. – medmunds