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("\\>",">")}
?js_string
演算子を探しています。
{
"field1" : "${response.value1?js_string}",
"field2" : "${response.value2?js_string}"
}
これにより、引用符や円記号などのエスケープが処理されます。あなたのJSを幸せにするために。
編集:Freemarker2.3.19で?json_string
演算子が導入されているのを見たところです。正確な動作については、 ここ を参照してください。そして、多くの喜びがありました...
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">