我想创建以下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非法) 有没有办法更优雅地创建它,所以最后一个条目不包括非法逗号?
答案 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
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}}