在 Grails 控制器中呈现 JSON
在 “使用 Ajax 实现多对多关系” 中,您首先从一个 Grails 控制器返回 JSON。清单 4 中的闭包类似于您当时创建的闭包。不同之处在于,这个闭包是通过一个友好的 Uniform Resource Identifier(URI)访问的,这已在 “RESTful Grails” 中讨论。它还使用您在 “测试 Grails 应用程序” 中首次见到的 Elvis 操作符。
将一个名为 iata 的闭包添加到您在 “Grails 与遗留数据库” 中创建的 grails-app/controllers/AirportMappingController.groovy 类中,记得在文件顶部导入 grails.converters 包,如清单 4 所示:
清单 4. 将 Groovy 对象转换成 JSON
import grails.converters.*
class AirportMappingController {
def iata = {
def iata = params.id?.toUpperCase() ?: "NO IATA"
def airport = AirportMapping.findByIata(iata)
if(!airport){
airport = new AirportMapping(iata:iata, name:"Not found")
}
render airport as JSON
}
}
class AirportMappingController {
def iata = {
def iata = params.id?.toUpperCase() ?: "NO IATA"
def airport = AirportMapping.findByIata(iata)
if(!airport){
airport = new AirportMapping(iata:iata, name:"Not found")
}
render airport as JSON
}
}
在浏览器中输入 http://localhost:9090/trip/airportMapping/iata/den 进行测试。应该可以看到清单 5 中所示的 JSON 结果:
清单 5. JSON 中的一个有效的 AirportMapping 对象
{"id":328,
"class":"AirportMapping",
"iata":"DEN",
"lat":"39.858409881591797",
"lng":"-104.666999816894531",
"name":"Denver International",
"state":"CO"}
"class":"AirportMapping",
"iata":"DEN",
"lat":"39.858409881591797",
"lng":"-104.666999816894531",
"name":"Denver International",
"state":"CO"}
也可以输入 http://localhost:9090/trip/airportMapping/iata 和 http://localhost:9090/trip/airportMapping/iata/foo,以确认是否返回 “Not Found”。清单 6 显示了返回的无效的 JSON 对象:
清单 6. JSON 中的一个无效的 AirportMapping 对象
{"id":null,
"class":"AirportMapping",
"iata":"FOO",
"lat":null,
"lng":null,
"name":"Not found",
"state":null}
"class":"AirportMapping",
"iata":"FOO",
"lat":null,
"lng":null,
"name":"Not found",
"state":null}
当然,这样的 “考验” 不能替代真正的测试。