如何在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字符串的主要内容,如果未能解决你的问题,请参考以下文章
在 appsettings.json 中的连接字符串中转义双引号