JSON появляется как юникодные объекты в шаблоне Jinja2

Я использую Jinja2 с webapp2.

Jinja2 кодирует все "контекстные" данные в unicode, как говорит их документ. Это оказывается проблематичным, когда я пытаюсь вставить строку json в шаблон:

jsonData = json.loads(get_the_file('catsJson.txt'))

Я передаю jsonData для шаблона, и я могу его зацикливать, но когда я вставляю json-элемент в HTML, он выглядит так:

<option value='[u&#39;dogs&#39;, u&#39;cats&#39;]'>

Я хочу, чтобы он выглядел так (как в исходной строке 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 }}