2011-06-17 241 views
17

我們正在使用Spring MVC和freemarker作爲模板語言來構建一個restful api。我們選擇建立在freemarker的JSON響應如何在freemarker中跳出json字符串

例freemarker.ftl:

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

我們得到了一個問題,當值的字符串包含引號(或任何其他字符的JSON語法)。

問題:如何使用freemarker轉義這些字符串?

我們已經看了?xml?html但他們並不涵蓋所有相關的字符(如\)。

編輯:?js_string將轉義字符串來與JavaScript通信。由於JSON基於JavaScript(JavaScript對象表示法),因此它將起作用。

編輯2:如果單引號彈出,?js_script將轉義它,這又會導致無效的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

+0

+1爲Spring替代 – 2013-09-27 09:02:53

回答

23

您正在尋找的?js_string操作。

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

這將照顧轉義引號,反斜槓等。 al爲了讓你的JS高興。

編輯:我剛纔看到他們在Freemarker 2.3.19中引入了一個?json_string運算符。確切地說,它的工作原理見here。而有多少日子 -

+0

請告訴我的優勢,js_string超過j_string在這種情況下??? – Skurpi 2011-06-17 09:04:31

+0

@Skurpi好處是'js_string'做了必要的轉義,而'j_string'沒有轉義。 – Waldheinz 2011-06-17 09:06:35

+0

@Waldheinz&@stevevls謝謝! – Skurpi 2011-06-17 09:07:43

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

這實際上是我們所做的,但我們在其中添加了一些額外的功能: <#macro hazStringContent content> \t <#if content?has_content && content!=「」>「$ {content?js_string ?替換(「\\'」,「\'」)?替換(「\\>」,「>」)}「<#else> null Skurpi 2012-02-14 12:32:56