如何在freemarker中转义json字符串

Posted

技术标签:

【中文标题】如何在freemarker中转义json字符串【英文标题】:How to escape json strings in freemarker 【发布时间】:2011-09-17 00:46:25 【问题描述】:

我们正在使用 Spring MVC 和 freemarker 作为模板语言构建一个 restful api。我们选择在 freemarker 中构建 json 响应

freemarker.ftl 示例:


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

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

问题:如何使用 freemarker 转义这些字符串?

我们查看了?xml?html,但它们并未涵盖所有相关字符(例如\)。

编辑: ?js_string 将转义字符串以符合 javascript。而且由于 JSON 是基于 JavaScript(JavaScript Object Notation)的,所以它可以工作。

EDIT2: 如果弹出单引号,?js_string 将转义它,这又会导致 JSON 无效。它的修补程序是:

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

如果你真的很挑剔:

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

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

【问题讨论】:

+1 用于 Spring 替代方案 【参考方案1】:

您正在寻找?js_string 运算符。


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

这将处理转义引号、反斜杠等。为了让你的 JS 开心。

编辑:我刚刚看到他们在 Freemarker 2.3.19 中引入了 ?json_string 运算符。请参阅here 了解其工作原理。并且有很多欢乐...

【讨论】:

在这种情况下 ?js_string 比 ?j_string 有什么优势? @Skurpi 我明白了......它不喜欢转义的单引号。试试这个去掉单引号上的反斜杠:$variable?js_string?replace('\\'', '\'') 尝试解决这样的个别问题似乎很冒险。我更喜欢一种“自动化”的方式来处理这个问题,因为它可能会逃脱一些其他字符可能会失败。 @stevevls 应该是:$variable?js_string?replace("\\'", "\'") 但是非常好! @Skurpi 同意内置将是最好的方法。希望他们能在下一版本的 Freemarker 中加入一个!【参考方案2】:

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

<#macro json_string string>$string?js_string?replace("\\'", "\'")?replace("\\>", ">")</#macro>

"field1" : "<@json_string "$response.value1"/>",
"field2" : "<@json_string "$response.value2"/>"

如果您想在多个模板中重复使用宏,请将其放在自己的文件中并include the file,而不是复制宏:

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

【讨论】:

这实际上是我们所做的,但我们在其中添加了一些我们曾经使用过的额外功能: "$ content?js_string?replace("\\'", "\'")?replace("\\>",">")"null#if> #macro>跨度>

以上是关于如何在freemarker中转义json字符串的主要内容,如果未能解决你的问题,请参考以下文章

你如何在 Freemarker 中转义正则表达式字符串

如何在 JSON 中转义特殊字符

杰克逊没有在 JSON 中转义引号

在 appsettings.json 中的连接字符串中转义双引号

在作为 EJS 模板传递以查看的字符串化 JSON 中转义单引号

vue.js:如何在转义内容中转义变量