今天遇到了这个奇怪的结果,试图在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 ...]
答案 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
,提及render
,contentType
或text
,model
等。所以为了在浏览器/视图中将内联控制逻辑呈现为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”应用于结果!
不要忘记将括号括起来只是方法调用的快捷方式,但仍然适用相同的规则。