如何在Grails 2.3中的JSON渲染中排除集合的属性

时间:2014-04-09 17:51:01

标签: rest grails

我正在尝试设置一个休息网络服务(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属性?

1 个答案:

答案 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