我在渲染List结果时遇到问题,是grails无法呈现列表吗? 这是我的代码
def findSome(){
String query = params?.some
List<Some> someList = Some.createCriteria().list(max : 5) {
if(query != null && query != ""){
and {
like("name", query)
}
}
order("name", "asc")
}
someList = someList == null ? new ArrayList<Some>() : someList
->> render someList as JSON
}
我的代码有问题吗?我记得的是,grails CAN渲染对象列表。但是使用此代码,始终返回null与标记->>
一致。
答案 0 :(得分:4)
由于您从条件查询中获得的结果是对象列表,因此您应该将someList用作 JSONArray 。为了呈现为JSON,您的列表应具有相应的键值对。如果你真的想要JSON对象,最好将someList转换为键值对的映射并渲染为JSON。
def findSome(){
String query = params?.some
List<Some> someList = Some.createCriteria().list(max : 5) {
if(query != null && query != ""){
and {
like("name", query)
}
}
order("name", "asc")
}
someList = someList == null ? new ArrayList<Some>() : someList
render someList as JSONArray
}
如果要渲染为JSON,请使用以下代码:
def findSome(){
def someMap=[:]
String query = params?.some
List<Some> someList = Some.createCriteria().list(max : 5) {
if(query != null && query != ""){
and {
like("name", query)
}
}
order("name", "asc")
}
someList = someList == null ? new ArrayList<Some>() : someList
someList.each{
someMap.put(it.id,it)
}
render someMap as JSON
}
答案 1 :(得分:0)
您应该在标准之外移动测试以进行查询。如果查询什么都没有,那就没有意义了。您也不需要并且在您的条件查询中,您可以使用eq(&#34; name&#34;,query)
在你的情况下,喜欢和eq是相同的。
答案 2 :(得分:0)
是的,grails可以呈现对象列表。关于您的查询,您可以简化为类似的事情。
def findSome() {
respond Some.createCriteria().list {
like 'name', "%$query%"
maxResults 5
order 'name', 'asc'
}
}
如果您担心查询参数为空,则可以将该责任委托给command objects或url mappings constraints,具体取决于您的情况。
在Responding with JSON部分,您可以找到其他方式来回应json
答案 3 :(得分:0)
这只发生在我身上一次,我通过强迫回应解决了这个问题:
<?php
$manager = new MongoDB\Driver\Manager("mongodb://myusername:myp%40ss%3Aw%25rd@example.com/mydatabase");
?>
这很明显,但请确保该方法在控制器内,并且具有以下配置:
render(text: someList as JSON, contentType: 'application/json', encoding: 'UTF-8')