如何在自由标记中转义 json 字符串

2022-09-02 01:17:34

我们正在使用Spring MVC和freemarker作为模板语言构建一个宁静的API。我们选择在自由标记中构建 json 响应

示例 freemarker.ftl:

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

当值中的字符串包含引号(或 JSON 语法中的任何其他字符)时,我们会遇到问题。

问题:如何使用自由标记转义这些字符串?

我们已经看过或但它们没有涵盖所有相关字符(例如)。?xml?html\

编辑:将转义字符串以与JavaScript兼容。由于JSON基于JavaScript(JavaScript Object Notation),它将起作用。?js_string

编辑2:如果弹出单引号,将对其进行转义,这再次导致无效的JSON。它的修补程序是:?js_string

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

如果你真的想挑剔:

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

或者,如果您使用弹簧: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


答案 1

您正在寻找操作员。?js_string

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

这将负责转义引号,反斜杠等。为了让你的JS开心。

编辑:我刚刚看到他们在Freemarker 2.3.19中引入了一个运算符。请参阅此处,了解其工作原理。而且有很多欢欣鼓舞...?json_string


答案 2

使用 FreeMarker 宏组合上述所有答案,同时使模板更具可读性和可维护性:

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

如果要在多个模板中重用宏,请将其放在其自己的文件中并包含该文件,而不是复制宏:

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