Grails 3 JSON 渲染无法渲染列表?

Grails 3 JSON render can not render 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 可以渲染对象列表。但是使用此代码,始终 return null 符合标记 ->>.

您应该将查询测试移到标准之外。如果查询什么都没有,就没有必要创建它。你也不需要,在你的条件查询中,你可以只使用 eq ("name", query)

在你的情况下 like 和 eq 是一样的。

是的,grails 可以呈现对象列表。关于你的查询,你可以简化成这样。

def findSome() {
    respond Some.createCriteria().list {
        like 'name', "%$query%"

        maxResults 5
        order 'name', 'asc'
    }
}

如果您担心查询参数为空,您可以将该责任委托给 command objects or url mappings constraints,这取决于您的情况。

Responding with JSON 部分,您可以找到其他方式来回复 json

这只发生在我身上一次,我通过强制回复解决了它:

render(text: someList as JSON, contentType: 'application/json', encoding: 'UTF-8')

这很明显,但请确保该方法在控制器内部并且具有以下配置:

static responseFormats = ['json', 'html']

由于您从条件查询中获得的结果是一个对象列表,您应该使用 render someList as 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

}