5

今天遇到了这个奇怪的结果,试图在 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

4 回答 4

8

这是正常的行为render。当您提供render不带大括号的参数时

render model as JSON

它对设置content-typeto进行了隐式调整text/json。但是在后一种情况下,您在不知不觉中render使用了大括号,例如 [mark on the first 大括号 after rendermake render use the normal render()]

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

在上述情况下,您必须传入命名参数以render提及contentTypetextmodelstatus。因此,为了在浏览器/视图中将内联控制逻辑呈现为 JSON,您必须执行以下操作:

render(contentType: "application/json", text: [products: (products ?: "No products found")] as JSON)

您也可以使用content-typeas text/json。我更喜欢application/json.

更新
替代最简单的方法:
render([products: (products ?: "No products found")] as JSON)

于 2013-05-26T00:39:21.503 回答
3

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

render x as JSON

意思是

render (x as JSON)

但它解释

render (x) as JSON

意思是

(render x) as JSON

如果方法名称(在本例中render)紧跟左括号,则只有匹配的右括号之前的代码才被视为参数列表。这就是为什么你需要一组额外的括号来说明

render ((x) as JSON)
于 2013-05-26T18:38:59.250 回答
1

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

render(contentType: 'text/json') {[
    'products': products ? : "No products found"
]}
于 2013-05-26T00:00:16.463 回答
1

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

不要忘记省略括号只是方法调用的快捷方式,但同样的规则仍然适用。

于 2013-05-26T00:49:11.010 回答