【问题标题】:Freemarker parse a String as JsonFreemarker 将字符串解析为 Json
【发布时间】:2012-10-16 17:58:51
【问题描述】:

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

例如:

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

并且能够从这个字符串中获取 text

【问题讨论】:

    标签: freemarker


    【解决方案1】:

    使用?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 表达式。也更新了我的答案,谢谢。
    • 如果您的 json 中有 UNICODE,这将不起作用。
    • @Ahmed 你的意思是\u&lt;code&gt; 转义。请注意,?eval_json 确实支持这一点(它是在您发表评论多年后添加的)。
    【解决方案2】:

    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}
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      猜你喜欢
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多