麻烦迭代结果集并生成json

时间:2015-02-12 12:42:03

标签: sql json groovy

我正在努力尝试从我执行的查询中生成一些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,我仍然是一个新手,任何帮助都非常感激。

2 个答案:

答案 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获取列表。如果您只是发送结果,您可能必须尝试,发生了什么。也许需要对地图进行强制转换,或者你必须自己进行映射。

如果你的行数非常高,你可能会比其他一些图书馆更好,不需要你事先清楚地列出这个列表。