django escapejs和simplejson

时间:2011-10-16 12:40:00

标签: django json escaping simplejson

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

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

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

感谢。 :)

2 个答案:

答案 0 :(得分: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一起使用 - 虽然我自己没有尝试过这个

答案 1 :(得分:0)

您正在以错误的顺序执行操作。您应该将数据转储为JSON字符串,然后转义该字符串。您可以使用addslashes Django过滤器进行转义。