8

可能这是不可能的,
但我想用freemarker在地图中转换一个json字符串

前任:

<#assign test = "{\"foo\":\"bar\", \"f\":4, \"text\":\"bla bla\"}">

并能够从此字符串中获取文本键

4

3 回答 3

24

使用?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 不支持。

于 2012-10-26T15:59:52.933 回答
5

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}
于 2012-10-26T15:23:42.397 回答
0

听起来您需要定义/实现一个读取 JSON的模板。

于 2012-10-26T13:06:57.840 回答