我正在努力尝试从我执行的查询中生成一些JSON。我看过的所有groovy JsonBuilder示例似乎只是静态定义数据集。
代码:
def db = new Sql(datasource)
def builder = new JsonBuilder()
db.eachRow('SELECT t.day, t.start FROM mytable') { row ->
builder.days {
day(
date row.day
)
}
}
println builder.toString()
我在1点处得到它,它只打印结果集中的最后一个值。
目前我收到以下错误:
unexpected token: $ @ line 46, column 18.
date row.day
在groovy,我仍然是一个新手,任何帮助都非常感激。
答案 0 :(得分:1)
我通常更愿意使用完整的对象呈现JsonBuilder
而不是使用DSL,所以我的解决方案看起来像这样:
def map = [days:[]]
def db = new Sql(dataSource)
db.eachRow('SELECT t.day, t.start FROM mytable') { row ->
map.days << [day : [date: row.day]]
}
println new JsonBuilder(map).toString()
如果你有大量的结果,这种方法的优点是不会强迫你编译一大堆GroovyRowResult
个对象,只有一大堆较小的LinkedHashMap
个对象。
答案 1 :(得分:0)
那里的构建器没有打开列表,添加项目,然后关闭它。你必须一次性提供它。例如。将所有行收集为地图:
def builder = new groovy.json.JsonBuilder()
def dbresult = [1,2,3]
builder {
days dbresult.collect{
[day: [date: it]]
}
}
println builder
使用db.rows
获取列表。如果您只是发送结果,您可能必须尝试,发生了什么。也许需要对地图进行强制转换,或者你必须自己进行映射。
如果你的行数非常高,你可能会比其他一些图书馆更好,不需要你事先清楚地列出这个列表。