2017-10-07 228 views
2

我在渲染List结果时有问题,Grails是不能渲染列表的? 这里我的代码Grails 3 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 JSON 
} 

有什么错我的代码?我记得的是,grails可以渲染对象列表。但使用此代码时,请始终按照标记->>返回空值。

+0

什么是'调用println someList'渲染前的输出? –

回答

3

既然你从你的标准获得结果的查询,你守的对象列表ld使用render 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 

}

0

您应该移动条件以外的查询测试。如果查询什么都没有,那么没有意义。你也不需要,在你的标准查询中,你可以使用eq(“name”,查询)

在你的情况下,like和eq是相同的。

+0

除非查询在其中有某处%... – billjamesdev

+0

我已经尝试过你所说的。与findAll()和我看到对象不是null。但是这个控制器总是返回null异常,在错误视图中有'['''。我不知道这个JSON转换器会发生什么:| – dadang1234

0

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

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

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

如果您关注的是,查询参数是空的,你可以委托你的情况下责任command objectsurl mappings constraints这取决于。

Responding with JSON部分,你可以找到其他的方式来为JSON

+0

我认为错误不在查询中。我用findAll()试过了,它返回相同的错误:| – dadang1234

+0

你使用什么grails版本? – user615274

+0

Grails版本:3.2.8 – dadang1234

0

这发生在我身上只有一次回应,我通过强迫响应解决它:

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

这是相当明显的,但要确保该方法是控制器内,故有此配置:

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