django escapejs和simplejson

src*_*tro 6 django json escaping simplejson

我正在尝试使用simplejson.dumps将Python数组编码为json:

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

In [31]: simplejson.dumps(s1)
Out[31]: '["test", "<script>"]'
Run Code Online (Sandbox Code Playgroud)

工作良好.

但是我想在调用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"]
Run Code Online (Sandbox Code Playgroud)

我的问题是:我希望转义的字符串是:["test", "\u003Cscript\u003E"]而不是["test", "\\u003Cscript\\u003E"]

我可以用replace:

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

但这是一个好方法吗?我只想在将它们编码为json之前首先转义字符串.因此,当我在模板中使用它们时,不会出现语法错误.

谢谢.:)

med*_*nds 8

simplejson 2.1.0及更高版本包含一个JSONEncoderForHTML编码器,它可以完全满足您的需求.要在您的示例中使用它:

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

我最近碰到了这个,我无法控制生成数据结构的代码,因此我无法在组装时逃避字符串.JSONEncoderForHTML在输出点上巧妙地解决了这个问题.

当然,你需要有simplejson 2.1.0或更高版本.(Django的使用来使用旧版本,并Django的1.5弃用django.utils.simplejson完全).如果你不能因为某些原因进行升级,JSONEncoderForHTML码相对较小,很可能被拉入前面的代码或使用的Python 2.6 +的json包 - 虽然我自己没试过