如何使用groovy GStringTemplateEngine

时间:2017-03-08 07:50:27

标签: json groovy

我想创建以下json:

{
"reviewers": [
    {
      "user": { 
        "name": "a"
      }
    },
    {
        "user": {
          "name": "b"
      }
    },
    {
        "user": {
          "name": "c"
      }
    }
  ]
}

使用:

users= ["a", "b", "c"]
def binding = [
        arr : users
]

def f = new File(templateFileName)
def engine = new groovy.text.GStringTemplateEngine()
def template = engine.createTemplate(f).make(binding)
println template.toString()

我为模板尝试了几种变体,最后以:

结束
{
"reviewers": [
    <%  arr.each { out <<
  """ {
        "user": {
          "name": "${it}"
        }
},"""
} %>
]
}

这导致:

    {
  "reviewers": [
     {
        "user": {
          "name": "a"
        }
}, {
        "user": {
          "name": "b"
        }
}, {
        "user": {
          "name": "c"
        }
},// <-- illegal comma
]
}

问题在于最后一个条目添加了一个冗余的逗号(导致json非法) 有没有办法更优雅地创建它,所以最后一个条目不包括非法逗号?

3 个答案:

答案 0 :(得分:4)

另一种方法是使用collect而不是each处理每个数组元素以及子模板(您粘贴的第二个三重引用文本)。接下来,使用,\n连接所有元素,就像这样

tpl = '''{
"reviewers": [
    <%  out << arr.collect {
  """ {
    "user": {
      "name": "${it}"
    }
}"""
}.join(',\\n') %>
]
}
'''

users= ["a", "b", "c"]
def binding = [
    arr : users
]

def engine = new groovy.text.GStringTemplateEngine()
def template = engine.createTemplate(tpl).make(binding)
println template.toString()

请注意,out给出了整个计算的结果,而不是在每次迭代期间。

答案 1 :(得分:2)

您应该可以使用JsonBuilder

轻松构建它
def users= ["a", "b", "c"]
def jsonBuilder = new groovy.json.JsonBuilder() 
jsonBuilder { reviewers users.collect { u ->
    return { user { name (u) } }
  }
}
println(jsonBuilder.toPrettyString())​

可以在线快速尝试以上示例 Demo

Rao有答案,但将其包装为模板看起来像:

def tpl = '''<%=
def jsonBuilder = new groovy.json.JsonBuilder() 
jsonBuilder {
    reviewers users.collect { u ->
        { -> user { name (u) } }
    }
}
jsonBuilder.toPrettyString()
%>'''

users= ["a", "b", "c"]
def binding = [
    users : users
]

def engine = new groovy.text.GStringTemplateEngine()
def template = engine.createTemplate(tpl).make(binding)
println template.toString()

答案 2 :(得分:0)

我找到了另一种不使用JsonBuilder来创建模板的选项。

在这种情况下,我使用了join(,),因此最后没有冗余的逗号字符。 (它也可以作为更大的json文件的内部部分)

{{1}}