Grails 3 JSON渲染无法呈现List?

时间:2017-10-07 18:00:35

标签: json grails groovy grails3

我在渲染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与标记->>一致。

4 个答案:

答案 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 objectsurl 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')