使用条件运算符在 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,提及contentTypetextmodelstatus 等。因此,为了将内联控制逻辑呈现为 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”无法正确呈现的主要内容,如果未能解决你的问题,请参考以下文章

在 Grails 中使用 HTTP 状态代码呈现 JSON 的简单方法

如何使用 ReactiveBase 有条件地呈现搜索结果

Grails 如何知道将“布局”应用于它呈现的页面?

Grails - 将 UUID 呈现为 JSON

如何使用 Grails 4 JSON 视图呈现域对象的地图

在 grails 服务中使用 g.render