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
}
我在渲染列表结果时遇到问题,是不是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
}