6

我正在尝试使用 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。所以当我在模板中使用它们时不会出现语法错误。

谢谢。:)

4

2 回答 2

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 代码相对较小,可能会被拉入早期代码或与Python一起使用2.6+的json包——虽然我自己没试过

于 2011-10-18T02:11:13.283 回答
0

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

于 2011-10-16T12:46:35.240 回答