2012-01-03 18 views
11

Yo uso Jinja2 con webapp2.JSON aparece como entidades unicode en la plantilla Jinja2

Jinja2 codifica todos los datos de "contexto" en unicode como dice su documento. Esto está resultando problemático cuando intento insertar una cadena JSON en la plantilla:

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

Paso jsonData a la plantilla y que soy capaz de bucle con éxito, pero cuando inserto un elemento JSON en HTML, lo que parece de esta manera:

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

quiero que se vea como esto (como lo es en la cadena JSON originales):

<option value='["dogs", "cats"]'> 

¿Alguna sugerencia?

Respuesta

21

Debe filtrar el valor a través del filtro safe para indicar a jinja2 que no debe aplicar ningún otro filtro a la salida. En la sintaxis Jinja2 esto sería:

{{ jsonData | safe }} 

Tenga en cuenta que desde que está llamando json.loads que en realidad no tiene más datos JSON, que tiene un objeto de lista pitón. Por lo tanto, cuando se serializa, es lo mismo que llamar al unicode(['dogs', 'cats']), que le dará su prefijo u. Puede que no quieras analizar realmente los datos de json, o tendrás que convertir la lista en una cadena manualmente en lugar de hacer que jinja2 lo haga por ti.

+2

ahora se da salida: '[u'dogs, u'cats']' ¿Cómo se quita el prefijo u? – ofko

+0

Convierta los elementos de la matriz a 'str':' map (str, jsonData) ' – Xion

+0

respuesta actualizada, está dejando que jinja2 convierta una lista de python en una cadena, por lo que termina usando la representación de cadena de una lista. –

-1

En Jinja 2.9 Seguí el consejo de @ Xion para convertir primero los elementos iterables en una cadena usando map('string'). El resultado del filtro de mapas lo convertí a una lista que finalmente sale como JSON usando el filtro incorporado tojson.

{{ jsonData|map('string')|list|tojson }} 
Cuestiones relacionadas