おそらくそれは不可能です
が、フリーマーカーを使用してマップ内のjson文字列を変換したいと思います
元:
<#assign test = "{\"foo\":\"bar\", \"f\":4, \"text\":\"bla bla\"}">
この文字列からテキストキーを取得できます
おそらくそれは不可能です
が、フリーマーカーを使用してマップ内のjson文字列を変換したいと思います
元:
<#assign test = "{\"foo\":\"bar\", \"f\":4, \"text\":\"bla bla\"}">
この文字列からテキストキーを取得できます
使用?eval_json
(FreeMarker 2.3.31が必要):
<#-- Using '...' instead of "..." for convenience: no need for \" escapes this way. -->
<#assign test = '{"foo":"bar", "f":4, "text":"bla bla"}'>
<#assign m = test?eval_json>
${m.foo} <#-- prints: bar -->
<#-- Dump the whole map: -->
<#list m as k, v>
${k} => ${v}
</#list>
2.3.31より前?eval
は、この目的で人気がありましたが、実際にはFreeMarker式が必要です。null
、または\uXXXX
エスケープをサポートしていないため、これは問題です(したがって、そのようなJSONの解析は失敗します)。また、JSONはサポートしていませんが、変数へのアクセスとメソッド/関数の呼び出しをサポートしているため、セキュリティ上の問題になる可能性があります。
freemarker.sourceforge.net/docs/pgui_datamodel_method.html
コードで:
// a class to parse Json, just add this method to your rendered template data
// with data.put("JsonParser", new FreemarkerJsonParser());
// or in shared variables http://freemarker.sourceforge.net/docs/pgui_config_sharedvariables.html
public class FreemarkerJsonParser implements TemplateMethodModel{
@Override
public Object exec(List args) throws TemplateModelException {
return new Gson().fromJson(s, new TypeToken<Map<String, String>>() {}.getType());((String) args.get(0));
}
}
テンプレート内:
<#assign map = JsonParser("{\"foo\":\"bar\", \"f\":4, \"text\":\"bla bla\"}")>
${map.text}
JSONを読み取るテンプレートを定義/実装する必要があるようです。