【问题标题】:What is the easiest way to render a freemarker object as JSON?将 freemarker 对象呈现为 JSON 的最简单方法是什么?
【发布时间】:2016-02-21 16:06:10
【问题描述】:

我在 freemarker 中有一个数据结构,我想在输出中将其呈现为 JSON 表示法,类似于 Javascript 的 JSON.stringify,freemarker 中是否有诸如 object?json 之类的东西或任何其他简单的方式?

【问题讨论】:

  • 为什么不以 JavaScript 格式将其发送到客户端并使用客户端渲染:JSON.stringify(YOUR_OBJECT, null, '\t');
  • 有没有一种简单的方法可以将对象作为 Javascript 发送到客户端?实际上,我不会在意它是 JSON 还是(更轻松的表示)Javascript。
  • 在答案部分添加了一种将对象发送给客户端的可能方式。

标签: json freemarker


【解决方案1】:

您可以按如下方式创建配置并设置您的 ObjectMapper 实例:

Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
try {
  cfg.setSharedVariable("JSON",
    configuration.getObjectWrapper().wrap(new ObjectMapper()));
} catch (TemplateModelException e) {
    throw new RuntimeException(e);
}
 

使用此配置创建的模板可以按如下方式访问它以呈现您的对象:

{
  "yourObjectPropertyName": ${JSON.writeValueAsString(yourObject)}
}

【讨论】:

  • 啊,有趣。你提到这一点很酷,因为我最近遇到了我的解决方案的问题,尽管几年前我确实问过,所以你的建议来得正是时候,哇! :-)
  • 如果您觉得该解决方案有帮助,请不要犹豫,为它点赞,以便其他人也能找到它。
【解决方案2】:

我们为 FreeMarker 编写了一个简单的伪 DataLoader,它返回一个提供 stringify() 和 parse() 方法的“JSON”对象:

package de.teambits.server.fmpp;

import flexjson.JSONDeserializer;
import flexjson.JSONSerializer;
import fmpp.Engine;
import fmpp.tdd.DataLoader;

import java.util.List;

/**
 * Returns a JSON object that offers parse() and stringify() methods for use in fmpp
 */
public class JSONFactory implements DataLoader {

    @Override
    public Object load(Engine e, List args) throws Exception {
        return new JSON();
    }

    public static class JSON {
        public String stringify(Object object) {
            return new JSONSerializer().deepSerialize(object);
        }

        public Object parse(String jsonString) {
            return new JSONDeserializer().deserialize(jsonString);
        }
    }
}

所以,如果你将这个 JSON 对象添加到你的 Freemarker / fmpp 配置中:

data: {
    JSON: de.teambits.server.fmpp.JSONFactory()
}

您可以简单地拨打${ JSON.stringify(object) }${ JSON.parse("json-string") }

【讨论】:

【解决方案3】:
<script>
    /* inside script tag assign js variable with Java Obj values */
    var JSObj = {};
    <#assign JavaObj = model["JavaObj"]>
    JSObj.value1 = ${JavaObj.val1};
    JSObj.value2 = ${JavaObj.val2};
    /*OR alternatively one can use FTL interator to assign large Java List etc */

   /* Once transferred to client side use the JSON.stringify(YOUR_OBJECT, null, '\t');  kind of function to display in UI  */

</script>

【讨论】:

  • 啊,想法是从 Freemarker 创建 JS 代码。我在一种情况下所做的是明确创建 JSON { "value1": "${obj.val1}", "value2": ${obj.val2WhichIsAnInt} } - 但是,我正在寻找一个通用的解决方案。跨度>
【解决方案4】:

没有内置这样的功能。(当然,您可以使用一些外部库来执行此操作,例如 Gson,并从模板中调用它。)

【讨论】:

  • 好主意,我去看看。感谢您的提示! :-)
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 2018-10-04
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多