使用groovy

时间:2016-10-28 15:58:41

标签: json groovy

我正在尝试根据从数据库中检索的数据动态构建一些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("""]}}""")

2 个答案:

答案 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在这里另外回答。