使用条件运算符在 Grails 中呈现“as JSON”无法正确呈现
Posted
技术标签:
【中文标题】使用条件运算符在 Grails 中呈现“as JSON”无法正确呈现【英文标题】:Rendering 'as JSON' in Grails with conditional operator doesn't render correctly 【发布时间】:2013-05-21 04:40:41 【问题描述】:今天遇到了这个奇怪的结果,试图在 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...]
【问题讨论】:
【参考方案1】:这是render
的正常行为。当您向render
提供不带大括号的参数时,例如
render model as JSON
它会进行隐式调整,将content-type
设置为text/json
。但是在后一种情况下,您在不知不觉中使render
使用大括号,例如[在render
之后的第一个大括号上标记使渲染使用正常的render()
]
render ((products) ? [products:products] : [products:"No products found"]) as JSON
.
在上述情况下,您必须将命名参数传递给render
,提及contentType
、text
或model
、status
等。因此,为了将内联控制逻辑呈现为 JSON在浏览器/视图中,您必须执行以下操作:
render(contentType: "application/json", text: [products: (products ?: "No products found")] as JSON)
您也可以将content-type
用作text/json
。我更喜欢application/json
。
更新另一种最简单的方法:render([products: (products ?: "No products found")] as JSON)
【讨论】:
该死,我在没有意识到的情况下调用render()
,谢谢,我最终使用了您解决方案的元素,它有点短,并且避免了两次指定内容类型:@987654341 @
这也可以:render ((products ? [products:products] : [products:"No products found"]) as JSON )
@JamesKleeh Ace 在洞中,太好了!..正是我想要的!
@JamesKleeh 脱帽致敬。总有一种更清洁、更好、更简单的做事方式。感谢您展示这一点。 :)
@JamesKleeh 再次出现:render([products: (products ?: "No products found")] as JSON)
【参考方案2】:
你的问题的本质是groovy编译器解释
render x as JSON
意思是
render (x as JSON)
但它会解释
render (x) as JSON
意思是
(render x) as JSON
如果方法名称(在本例中为 render
)后紧跟左括号,则只有匹配右括号之前的代码才被视为参数列表。这就是为什么你需要一组额外的括号来表示
render ((x) as JSON)
【讨论】:
【参考方案3】:不知道原因。尝试这样使用:
render(contentType: 'text/json') [
'products': products ? : "No products found"
]
【讨论】:
【参考方案4】:您所做的是使用 ( ) 中的参数调用渲染,然后将“as JSON”应用于结果!
不要忘记省略括号只是方法调用的快捷方式,但同样的规则仍然适用。
【讨论】:
以上是关于使用条件运算符在 Grails 中呈现“as JSON”无法正确呈现的主要内容,如果未能解决你的问题,请参考以下文章