渲染';作为JSON';在Grails中,条件运算符不';无法正确渲染

渲染';作为JSON';在Grails中,条件运算符不';无法正确渲染,json,grails,groovy,rendering,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

今天我在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
…那么为什么没有
模型的缩短版不起作用呢

def products = []       
render ((products) ? [products:products] : [products:"No products found"]) as JSON
上面代码生成的JSON是作为一行文本输出的,因此我怀疑它没有将
作为JSON
拾取,但是它正确地插入了括号,那么这是怎么回事呢

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


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

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

这是
render
的正常行为

将模型呈现为JSON

它将
内容类型设置为
文本/json
,进行隐式调整。但在后一种情况下,您不知不觉地使
渲染使用大括号,如[在
渲染后的第一个大括号上标记
使渲染使用正常的
渲染()
]

将((产品)?[products:products]:[products:“未找到产品”])呈现为JSON

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

render(contentType: "application/json", text: [products: (products ?: "No products found")] as JSON)
您还可以将
内容类型
用作
text/json
。我更喜欢
application/json

更新
最简单的替代方法:

render([产品:(产品?:“未找到产品”)]作为JSON)

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


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

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

render x as JSON
render (x) as JSON
意指

render (x as JSON)
(render x) as JSON
但它解释了

render x as JSON
render (x) as JSON
意指

render (x as JSON)
(render x) as JSON
如果一个方法名(在本例中是
render
)后面紧跟着一个左括号,那么只有匹配的右括号内的代码才会被视为参数列表。这就是为什么需要一组额外的括号来表示

render ((x) as JSON)

该死,我正在调用
render()
,甚至没有意识到它,thx,我最终使用了您的解决方案的元素,它稍微短了一点,并且避免了两次指定内容类型:
render(contentType:“text/json”){[products:(products?:“No products found”)}
这也可以工作:
render((products?[产品:产品]:[产品:“未找到产品])作为JSON)
@JamesKleeh Ace in the hole,nice!。这正是我要找的!@JamesKleeh脱帽致敬。做事总是有一种更干净、更好、更简单的方式。感谢你展示这一点。:@JamesKleeh这里再次:
呈现([产品:(产品?:“未找到产品”)]作为JSON)