我正在尝试使用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之前首先转义字符串。因此,当我在模板中使用它们时,不会出现语法错误。
感谢。 :)
答案 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过滤器进行转义。