2011-10-16 29 views
6

我想一個Python數組編碼爲使用JSON simplejson.dumps:Django的escapejs和simplejson

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

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

工作正常。

但我想打電話simplejson.dumps之前,首先躲過字符串(使用escapejs從Django中):

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"] 

但是,這是一個好辦法?在將它們編碼爲json之前,我只想先脫離字符串。所以當我在模板中使用它們時不會出現語法錯誤。

謝謝。 :)

回答

8

simplejson 2.1.0和更高版本包括一個JSONEncoderForHTML編碼器,它完全符合您的需求。要在您的例子中使用它:

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

我跑到這個地方最近我沒有過這是生成數據結構的代碼控制,從而爲他們被組裝我也難逃字符串。 JSONEncoderForHTML在輸出點整齊地解決了這個問題。

當然,你需要有simplejson 2.1.0或更高版本。 (Django以前使用的是舊版本,Django 1.5完全不贊成使用django.utils.simplejson。)如果由於某種原因無法升級,JSONEncoderForHTML code相對較小,可能會被拉入較早的代碼或與Python 2.6+'s json package一起使用 - - 雖然我自己沒有嘗試過這個

+0

是的,你是對的addslashes沒有爲我工作。我不知道有JSONEncoderForHTML。非常感謝你幫助我。 :) – srcastro

0

您正在按錯誤順序執行操作。您應該將您的數據轉儲到JSON字符串,然後轉義該字符串。您可以使用Django篩選器addslashes進行轉義。

+0

非常感謝您的幫助。對此,我真的非常感激。 :) – srcastro

+0

我不會推薦'addslashes'來生成json或html - 我相信這是用於SQL準備的。 'addslashes'不會防止像''這樣的字符串泄漏到你的html中。原來的問題提到'escapejs',這正是JavaScript輸出的正確轉義。 – medmunds