将 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 表示法,类似于 javascript 的 JSON.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 个块?
将嵌套的 Json 字符串转换为对象并在 Jquery 数据表单元格中呈现