Freemarker将String解析为Json

时间:2012-10-26 13:02:24

标签: freemarker

可能不可能,
但我想用freemarker

转换地图中的json字符串

例如:

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

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

3 个答案:

答案 0 :(得分:16)

使用?eval。它的工作原理是因为JSON映射碰巧是有效的FreeMarker表达式(更新:除了FreeMarker 2.3.x中无法识别null)。

<#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>

(顺便说一句,如果您使用\"而不是'引用字符串,则不必使用"。)

答案 1 :(得分:4)

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}

答案 2 :(得分:0)

听起来你需要定义/实现一个读取JSON的template