如何创建n深度的Freemarker模板?

时间:2018-08-07 23:23:33

标签: java freemarker

我正在尝试使用Apache Freemarker以n层深的json-esque格式显示一些数据。在未知的情况下,我试图输出类似于以下内容的内容:

{
  "name": "Human",
  "type": "object",
  "fields": [
    {
      "name": "weight"
      "type": "int"
    },
    {
      "name": "Origin"
      "type": "object"
      "fields": [
        {
          "name": "fatherOrigin"
          "type": "object"
          "fields": [
             ... 
          ]
        },
        {
          "name": "motherOrigin"
          "type": "object"
          "fields": [
             ... 
          ]
        }]
    }]
}

我想使用一个while循环,用伪代码看起来像这样。

while(1){
  if (currType is object) {
      print what you know and walk deeper
   }else{
      print your output and break
  }

但是,freemarker不支持while循环。我的替代方法是创建一个列表,该列表的大小大于任何合理的深度(30)

这是该问题的可接受设计吗?有没有更好的方法来解决呢?

谢谢!

1 个答案:

答案 0 :(得分:1)

确实没有while循环。我能想到的最干净的方法是<#list 0.. as _>...</#list>,但要注意,0..仅在具有足够高的incompatible_improvements配置设置值的情况下才能正常工作(作为无穷级数)。 _只是一个普通变量,但表示我不在乎名称。

但是,通常,最好使用递归来处理嵌套结构。宏和函数支持这一点。然后,#list -s(如果您根本需要它们)通常会仔细检查数据模型中的实际内容,而不是您作为解决方法构建的范围。