【问题标题】:Rendering JSON in grails在 grails 中渲染 JSON
【发布时间】:2012-03-27 05:30:25
【问题描述】:

我使用以下代码以 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"
}

【问题讨论】:

    标签: json grails


    【解决方案1】:

    JSON 对象的构建方式非常模糊。我喜欢在 grails 中呈现 JSON 响应的方法是在 groovy 中创建地图或列表,然后使用 render 方法将其转换为 JSON。

    在 render 方法中做 rowResult 的转换会让人很困惑,我宁愿去做这样的事情

    def results = db.rows(query).collect { rowResult ->
        b(rowResult.name, c, d) 
    }
    render(contentType: 'text/json') {[
        'results': results,
        'status': results ? "OK" : "Nothing present"
    ]}
    

    我认为它更具可读性,甚至更短。这个 sn-p 可以得到你想要的结果:results 数组中没有对象,只有字符串。

    注意rows 的使用,它返回RowResult 的列表,无需从ResultSet 中获取它。该列表用于通过在每一行的名称上调用b 来收集转换后的值a。收集元素并不意味着创建一个地图(就像你得到的{ "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
    

    【讨论】:

    • 我比第一个更喜欢你的最后一个代码 sn-p。它也可能对调试器更友好。
    • 是的,JSON 转换器绝对是最好的选择:)
    • 在 Grails 2.0 中的最后一个 sn-p 出现问题。响应呈现为包含在 {} 中的文本。
    • @SAFX 我不知道为什么我从来没有看到这个评论。无论如何,它包含在 {} 中,因为这就是对象包含在 JSON 中的方式:json.org
    • 请问需要什么“状态”?是否需要手动检查(我的意思是 if(status==....){ ....} )是否找到了某些东西或者 grails/JS(client side ...) 需要什么? ?谢谢
    【解决方案2】:

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

    aMap.put("A", a)
    

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

    def aList = []
    aList << a
    

    会得到你想要的!

    作为旁注,grails 中有一个 JSON 转换器可以为您构建字符串。调查一下here

    【讨论】:

      【解决方案3】:

      这应该足以从控制器呈现 JSON:

      render results as grails.converters.JSON
      

      【讨论】:

        猜你喜欢
        • 2017-06-05
        • 2011-05-17
        • 1970-01-01
        • 1970-01-01
        • 2015-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-30
        相关资源
        最近更新 更多