【问题标题】:How to escape json strings in freemarker如何在freemarker中转义json字符串
【发布时间】: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 替代方案

标签: java json spring escaping freemarker


【解决方案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>跨度>
猜你喜欢
  • 2016-05-27
  • 2010-12-12
  • 1970-01-01
  • 2017-01-02
  • 2018-04-20
  • 2012-06-11
相关资源
最近更新 更多