我使用以下代码以JSON格式呈现数据。
render(contentType:"text/json") {
results = array {
db.eachRow(query) { row ->
def rs = row.toRowResult()
def a = b(rs.name,c,d)
aMap.put("A",a)
pair(aMap)
}
}
if (results) {
status = "OK"
}
else {
status ="Nothing present"
}
}
以上代码以下列格式生成JSON
{
"results": [
{"A":"value1"},
{"A":"value2"},
...................
{"A":"valuen"}
],
"status":"OK"
}
如上所述,数据呈现为对象数组。有没有办法可以将结果数据渲染为元素数组。像
{
"results": [
"value1",
"value2",
...................
"valuen"
],
"status":"OK"
}
答案 0 :(得分:36)
构建JSON对象的方式非常模糊。我喜欢在grails中渲染JSON响应的方法是在groovy中创建一个map或list,然后使用render
方法将其转换为JSON。
在渲染方法中对rowResult
进行转换会让人感到很困惑,我宁愿选择这样的东西
def results = db.rows(query).collect { rowResult ->
b(rowResult.name, c, d)
}
render(contentType: 'text/json') {[
'results': results,
'status': results ? "OK" : "Nothing present"
]}
我认为它更具可读性,甚至更短。这个片段可以获得所需的结果:results
数组中没有对象,只有字符串。
注意使用rows
,它返回RowResult的列表,从而无需从ResultSet中获取它。该列表用于通过在每行的名称上调用a
来收集转换后的值b
。收集元素并不意味着创建一个地图(就像你得到的{ "A":"value1"}
JSON一样),只是在新的空列表中使用<<
运算符实现了相同的@ will-buck。
我们使用render方法执行的操作是声明text/json
内容类型并向其传递包含要写入响应的键results
和status
的文字映射。条件运算符用于简明地确定状态。它也可以像这样使用,通过JSON转换器@ will-buck也提到:
def responseData = [
'results': results,
'status': results ? "OK" : "Nothing present"
]
render responseData as JSON
答案 1 :(得分:5)
只有一点点:)只需要改变
aMap.put("A", a)
是一个集合或列表,而不是一个地图。像
这样的东西def aList = []
aList << a
会得到你想要的东西!
作为旁注,Grails中有一个JSON转换器可以为您构建字符串。仔细研究here
答案 2 :(得分:0)
这应该足以从控制器呈现JSON:
render results as grails.converters.JSON