【发布时间】:2012-10-16 17:58:51
【问题描述】:
这可能是不可能的,
但我想用 freemarker 转换地图中的 json 字符串
例如:
<#assign test = "{\"foo\":\"bar\", \"f\":4, \"text\":\"bla bla\"}">
并且能够从这个字符串中获取 text 键
【问题讨论】:
标签: freemarker
这可能是不可能的,
但我想用 freemarker 转换地图中的 json 字符串
例如:
<#assign test = "{\"foo\":\"bar\", \"f\":4, \"text\":\"bla bla\"}">
并且能够从这个字符串中获取 text 键
【问题讨论】:
标签: freemarker
使用?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 不支持。
【讨论】:
test 有一个空值怎么办?还是未定义?
test 是字符串“null”或“undefined”呢?两者都不是有效的 FTL 表达式(尽管 null 将来有时会出现),因此您需要明确检查它们。 undefined 也不是有效的 JSON 表达式。也更新了我的答案,谢谢。
\u<code> 转义。请注意,?eval_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 的template。
【讨论】:
" 怎么样:P