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">