Django Escapejs и Simplejson - PullRequest
       21

Django Escapejs и Simplejson

6 голосов
/ 16 октября 2011

Я пытаюсь закодировать массив Python в json, используя simplejson.dumps:

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

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

Работает нормально.

Но я хочу сначала экранировать строки (используя escapejs из Django) перед вызовом simplejson.dumps:

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 ]

8 голосов
/ 18 октября 2011

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 - хотя я сам не пробовал

0 голосов
/ 16 октября 2011

Вы делаете операции в неправильном порядке.Вы должны вывести свои данные в строку JSON, а затем экранировать эту строку.Вы можете сделать выход с помощью фильтра addslashes Django.

...