我正在尝试根据从数据库中检索的数据动态构建一些json。直到开头'['是“根”我想你可以说。具有名称和值的下一部分是动态的,并且将基于我从db获得的结果数。我查询数据库,然后想法是迭代结果添加到json。我可以使用jsonBuilder作为根部分,然后使用jsonSlurper循环添加每个附加部分吗?我见过的大多数例子都是处理root,然后是一次“slurp”,然后加入这两个,所以不确定我是否应该尝试使用不同的循环方法并附加多个部分。
任何提示将不胜感激。感谢。
{
"hostname": "$hostname",
"path": "$path",
"extPath": "$extPath",
"appName": "$appName",
"update": {"parameter": [
{
"name": "$name",
"value": "$value"
},
{
"name": "$name",
"value": "$value"
}
]}
}
编辑:所以我最终做的只是使用StringBuilder来创建初始块,然后附加后续部分。也许不是最优雅的方式,但它的工作原理!
//Create the json string
StringBuilder json = new StringBuilder("""{
"hostname": "$hostname",
"path": "$path",
"extPath": "$extPath",
"appName": "$appName",
"update": {"parameter": ["""
)
//Append
sql.eachRow("""<query>""",
{ params ->
json.append("""{ "name": "params.name", "value": "params.value" },""");
}
)
//Add closing json tags
json.append("""]}}""")
答案 0 :(得分:2)
如果我正确地解释了你的解释并且数据不是很大(它可以存在于内存中),那么我构建一个Map
对象(在groovy中很容易使用)和之后将其转换为JSON。像这样:
def data = [
hostname: hostname,
path: path,
extPath: extPath,
appName: appName,
update: [parameter: []]
]
sql.eachRow(sqlStr) { row ->
data.update.parameter << [name: row.name, value: row.value]
}
println JsonOutput.toJson(data)
答案 1 :(得分:0)
如果您使用 Grails 和Groovy,则可以使用grails.converters.JSON
。
首先,定义一个名为config的JSON:
JSON.createNamedConfig('person') {
it.registerObjectMarshaller(Person) {
Person person ->
def output = [:]
output['name'] = person.name
output['address'] = person.address
output['age'] = person.age
output
}
}
这将导致对象类型为person的静态定义的命名配置。现在,您只需致电:
JSON.use('person') {
Person.findAll() as JSON
}
这将在一个JSON请求中返回数据库中的每个人的姓名,地址和年龄。我不知道你是否在这种情况下使用grails,因为纯粹的Groovy在这里另外回答。