使用条件运算符在Grails中渲染'as JSON'无法正确呈现

时间:2013-05-25 21:55:00

标签: json grails groovy rendering

今天遇到了这个奇怪的结果,试图在Grails 2.0.4中将对象列表呈现为JSON ...(我知道我会后悔因为我鼻子底下的东西而问这个...... 更新 5/26,我的预测是正确的,见下文: - ))

这很好用; JSON在浏览器中正确呈现...

def products = [] //ArrayList of Product objects from service       
def model = (products) ? [products:products] : [products:"No products found"] 
render model as JSON

..那么为什么没有model这个缩短的版本不起作用?

def products = []       
render ((products) ? [products:products] : [products:"No products found"]) as JSON

上面代码生成的JSON作为单行文本输出,所以我怀疑它没有找到as JSON,但是它的括号是正确的,那么交易是什么?

  

['products':[com.test.domain.Product:null,   com.test.domain.Product ...]

4 个答案:

答案 0 :(得分:8)

这是render的正常行为。当您向render提供没有大括号的参数时,如

render model as JSON

进行隐式调整,将content-type设置为text/json。但是在后一种情况下,你在不知不觉中让render使用括号,如[{1}}使得渲染使用正常render]

后第一个大括号上的标记

render()

在上述情况下,您必须将命名参数传递给render ((products) ? [products:products] : [products:"No products found"]) as JSON,提及rendercontentTypetextmodel等。所以为了在浏览器/视图中将内联控制逻辑呈现为JSON,您必须执行以下操作:

status

您也可以将render(contentType: "application/json", text: [products: (products ?: "No products found")] as JSON) 用作content-type。我更喜欢text/json

UPDATE
另类最简单的方式:
application/json

答案 1 :(得分:3)

你问题的实质是groovy编译器解释

render x as JSON

表示

render (x as JSON)

但它解释

render (x) as JSON

表示

(render x) as JSON

如果方法名称(在这种情况下为render)后面紧跟一个左括号,那么只有匹配的右括号的代码才被认为是参数列表。这就是为什么你需要一组额外的括号来说

render ((x) as JSON)

答案 2 :(得分:1)

不知道原因。尝试使用这样:

render(contentType: 'text/json') {[
    'products': products ? : "No products found"
]}

答案 3 :(得分:1)

您所做的是使用()中的参数调用render,然后将“as JSON”应用于结果!

不要忘记将括号括起来只是方法调用的快捷方式,但仍然适用相同的规则。