strings parse parameter length expressions java json spring escaping freemarker

java - parse - Cómo escapar de las cadenas json en freemarker.



length freemarker (2)

Estás buscando el operador ?js_string .

{ "field1" : "${response.value1?js_string}", "field2" : "${response.value2?js_string}" }

Eso se encargará de escapar de comillas, barras invertidas, et. Al fin de hacer feliz a tu JS.

Edición : Acabo de ver que introdujeron un operador ?json_string en Freemarker 2.3.19. Vea here exactamente cómo funciona. Y hubo mucho regocijo ...

Estamos construyendo una api tranquila usando Spring MVC y freemarker como lenguaje de plantillas. Hemos elegido construir respuestas json en el freemarker

Ejemplo freemarker.ftl:

{ "field1" : "${response.value1}", "field2" : "${response.value2}" }

Obtenemos un problema cuando las cadenas en los valores contienen comillas (o cualquiera de los otros caracteres en la sintaxis JSON).

La pregunta: ¿Cómo puedo escapar de estas cadenas usando freemarker?

Hemos examinado ?xml o ?html pero no cubren todos los caracteres relevantes (como / ).

EDITAR ?js_string escapará de la cadena para funcionar con JavaScript. Y como JSON se basa en JavaScript (Notación de objetos de JavaScript), funcionará.

EDIT2: En el caso de que aparezca una comilla simple ?js_script se escapará, lo que nuevamente lleva a JSON no válido. El hotfix para ello es:

${variable?js_string?replace("//'", "/'")}

Y si realmente quieres ser exigente:

${variable?js_string?replace("//'", "/'")?replace("//>",">")}

Alternativamente, si usa Spring: http://www.springsurf.org/sites/1.0.0.M3/spring-webscripts/spring-webscripts-documentation/reference/html-single/index.html#js-api-index-org.springframework.extensions.webscripts.json.jsonutils


Use una macro de FreeMarker para combinar todas las respuestas anteriores, mientras hace que la plantilla sea más fácil de leer y mantener:

<#macro json_string string>${string?js_string?replace("//'", "/'")?replace("//>", ">")}</#macro> { "field1" : "<@json_string "${response.value1}"/>", "field2" : "<@json_string "${response.value2}"/>" }

Si desea reutilizar la macro en varias plantillas, colóquela en su propio archivo e incluya el archivo en lugar de duplicar la macro:

<#include "/path/to/macro.ftl">