web-dev-qa-db-ja.com

freemarkerでjson文字列をエスケープする方法

SpringMVCとfreemarkerをテンプレート言語として使用してRESTfulAPIを構築しています。フリーマーカーでjson応答を作成することを選択しました

Freemarker.ftlの例:

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

値の文字列に引用符(またはJSON構文の他の文字)が含まれていると、問題が発生します。

質問:freemarkerを使用してこれらの文字列をエスケープするにはどうすればよいですか?

?xmlまたは?htmlを見てきましたが、関連するすべての文字(\など)を網羅しているわけではありません。

EDIT:?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

21
Skurpi

?js_string演算子を探しています。

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

これにより、引用符や円記号などのエスケープが処理されます。あなたのJSを幸せにするために。

編集:Freemarker2.3.19で?json_string演算子が導入されているのを見たところです。正確な動作については、 ここ を参照してください。そして、多くの喜びがありました...

29
stevevls

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">
2
Kevin Condon