json - 如何使用 groovy GStringTemplateEngine 在 json 文件中创建数组字段

标签 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 不合法) 有没有一种方法可以更优雅地创建它,以便最后一个条目不包含非法逗号?

最佳答案

另一种方法是使用 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 是整个计算的结果,而不是每次迭代期间的结果。

关于json - 如何使用 groovy GStringTemplateEngine 在 json 文件中创建数组字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42665755/

相关文章:

java - 在android中解析json数组

javascript - 在 JQuery 中解析 JSON 文件

jquery - json post 后无法重定向

java - 在 Play 2.3.7 上从 Promise<JsonNode> 检索 HTTP 状态

sorting - 按降序对 @Sortable 对象列表进行排序

ajax - 如何在 Elm 客户端和 Haskell (Yesod) 服务器之间发送 JSON

grails - Grails-通过父集合中子obj的存在来查找所有对象

java - 如何通过iReport将数据集从主报表传递到子报表?

groovy - XmlSlurper.parse(uri) 带有 HTTP 基本身份验证

groovy - 我可以在经过评估的 Groovy 脚本中获取错误的行号吗?