将 freemarker 对象呈现为 JSON 的最简单方法是啥?

Posted

技术标签:

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

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

【问题讨论】:

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

【讨论】:

为什么不用方法freemarker.org/docs/pgui_datamodel_method.html【参考方案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,并从模板中调用它。)

【讨论】:

好主意,我去看看。感谢您的提示! :-)

以上是关于将 freemarker 对象呈现为 JSON 的最简单方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Freemarker 和 Apache FOP 将项目列表呈现为 4 个块?

FreeMarker内建函数

将嵌套的 Json 字符串转换为对象并在 Jquery 数据表单元格中呈现

如何将json对象的值设置为swift 3中tableView中动态呈现的视图中的标签?

Grails - 将 UUID 呈现为 JSON

在 Freemarker 中将字符串转换为 JSON