在grails中呈现JSON

She*_*nny 17 grails json

我使用以下代码以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"
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码以下列格式生成JSON

{
    "results": [
        {"A":"value1"},
        {"A":"value2"},
        ...................
        {"A":"valuen"}
    ],
    "status":"OK"
}
Run Code Online (Sandbox Code Playgroud)

如上所述,数据呈现为对象数组.有没有办法可以将结果数据渲染为元素数组.喜欢

{
    "results": [
        "value1",
        "value2",
        ...................
        "valuen"
    ],
   "status":"OK"
}
Run Code Online (Sandbox Code Playgroud)

Est*_*ban 36

构建JSON对象的方式非常模糊.我喜欢在grails中渲染JSON响应的render方法是在groovy中创建一个map或list,然后使用该方法将其转换为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"
]}
Run Code Online (Sandbox Code Playgroud)

我认为它更具可读性,甚至更短.这个片段可以获得所需的结果:results数组中没有对象,只有字符串.

注意使用rows,返回RowResult的列表,消除了从ResultSet中获取它的需要.该列表用于a通过调用b每一行的名称来收集转换后的值.收集元素并不意味着创建一个地图(就像{ "A":"value1"}你得到的JSON 一样),只是<<在一个新的空列表中与运算符一起实现了相同的@ will-buck .

我们所有与渲染方法做的声明text/json内容类型和传递包含密钥的字面地图resultsstatus,要写入响应.条件运算符用于简明地确定状态.它也可以像这样使用,通过JSON转换器@ will-buck也提到:

def responseData = [
    'results': results,
    'status': results ? "OK" : "Nothing present"
]
render responseData as JSON
Run Code Online (Sandbox Code Playgroud)


Wil*_*uck 5

只有一点点:)只需要改变

aMap.put("A", a)
Run Code Online (Sandbox Code Playgroud)

是一个集合或列表,而不是一个地图.所以像

def aList = []
aList << a
Run Code Online (Sandbox Code Playgroud)

会得到你想要的!

作为旁注,Grails中有一个JSON转换器,可以为您构建字符串.看看它在这里