JSON появляется как юникодные объекты в шаблоне Jinja2
Я использую Jinja2 с webapp2.
Jinja2 кодирует все "контекстные" данные в unicode, как говорит их документ. Это оказывается проблематичным, когда я пытаюсь вставить строку json в шаблон:
jsonData = json.loads(get_the_file('catsJson.txt'))
Я передаю jsonData для шаблона, и я могу его зацикливать, но когда я вставляю json-элемент в HTML, он выглядит так:
<option value='[u'dogs', u'cats']'>
Я хочу, чтобы он выглядел так (как в исходной строке json):
<option value='["dogs", "cats"]'>
Любые предложения?
Ответы
Ответ 1
Вы должны отфильтровать значение через фильтр safe
, чтобы сообщить jinja2, что он не должен применять какие-либо другие фильтры к выходу. В синтаксисе jinja2 это будет:
{{ jsonData | safe }}
Обратите внимание, что поскольку вы вызываете json.loads
, у вас больше нет данных json, у вас есть объект списка python. Таким образом, когда он сериализуется, он совпадает с вызовом unicode(['dogs', 'cats'])
, который даст вам префикс u
. Возможно, вам не захочется разбирать данные json, или вам нужно будет перевернуть список в строку вручную, вместо того, чтобы сделать jinja2 для вас.
Ответ 2
В Jinja 2.9 я последовал совету @Xion, чтобы сначала преобразовать итерируемые элементы в строку, используя map('string')
. Затем результат фильтра карты преобразуется в список, который, наконец, выводится как JSON с использованием встроенного фильтра tojson
.
{{ jsonData|map('string')|list|tojson }}