我正在尝试设置一个休息网络服务(JSON),这就是我所得到的:
{"name":"test","routines":[{"class":"Routine","id":1},{"class":"Routine","id":2}]}
这就是我想要的:
{"name":"test","routines":[{"name": "routine-1"},{"name": "routine-2"}]}
我有这些域名:
class Program {
String name;
static hasMany = [routines: Routine]
}
class Routine {
String name
}
我有这个控制器:
class ProgramController extends RestfulController {
static responseFormats = ['json']
def show(Program program) {
respond program
}
}
我在resources.groovy
中添加了这个programRenderer(JsonRenderer, Program) {
excludes = ['class', 'id']
}
routineRenderer(JsonRenderer, Routine) {
excludes = ['class', 'id']
}
如何使用ProgramController的show method / action在json响应中包含Routine的name属性?
答案 0 :(得分:3)
ObjectMarshaller方法是技术上正确的方式。但是,代码编写起来很麻烦,并且在使用marshaller将域的字段同步是一个维护问题。
本着Groovy的精神,让事情变得非常简单,我们很高兴只为每个REST域添加一个out()
方法。
<强> Program.groovy 强>
class Program {
String name
static hasMany = [routines: Routine]
def out() {
return [
name: name,
count: routines?.size(),
routines: routines?.collect { [name: it.name] }
]
}
}
的 ProgramController.groovy 强>
import grails.converters.JSON
class ProgramController {
def show() {
def resource = Program.read(params.id)
render resource.out() as JSON
}
}
JSON响应
{
name: "test",
count: 2,
routines: [{ name: "routine-1" }, { name: "routine-2" }]
}
out()
方法方法可以轻松自定义响应JSON,例如为例程数添加count
。