也许这是不可能的,
但我想在freemarker中的地图转换JSON字符串
例如:
<#assign test = "{\"foo\":\"bar\", \"f\":4, \"text\":\"bla bla\"}">
并能够从这个字符串获取文本键
也许这是不可能的,
但我想在freemarker中的地图转换JSON字符串
例如:
<#assign test = "{\"foo\":\"bar\", \"f\":4, \"text\":\"bla bla\"}">
并能够从这个字符串获取文本键
使用?eval
。 它的工作原理,因为JSON地图恰好是有效的FreeMarker表达式(更新:除了null
不FreeMarker的2.3.x版本识别)。
<#assign test = "{\"foo\":\"bar\", \"f\":4, \"text\":\"bla bla\"}">
<#assign m = test?eval>
${m.foo} <#-- prints: bar -->
<#-- Dump the whole map: -->
<#list m?keys as k>
${k} => ${m[k]}
</#list>
(顺便说一句,你不必使用\"
如果你引用的字符串'
,而不是"
。)
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。