froi
froi

Reputation: 7778

How to exclude property of a collection in JSON rendering in Grails 2.3

I am trying to setup a rest webservice (JSON) this is what I am getting:

{"name":"test","routines":[{"class":"Routine","id":1},{"class":"Routine","id":2}]}

This is what I want to get:

{"name":"test","routines":[{"name": "routine-1"},{"name": "routine-2"}]}

I have these domains:

class Program {

    String name;

    static hasMany = [routines: Routine]
}
class Routine {

    String name

}

I have this controller:

class ProgramController extends RestfulController {

    static responseFormats = ['json']

    def show(Program program) {
        respond program
    }
}

I added this in the resources.groovy

programRenderer(JsonRenderer, Program) {
    excludes = ['class', 'id']
}

routineRenderer(JsonRenderer, Routine) {
    excludes = ['class', 'id']
 }

How do I include the name property of Routine in the json response using the show method/action of ProgramController?

Upvotes: 0

Views: 569

Answers (1)

Dem Pilafian
Dem Pilafian

Reputation: 5986

The ObjectMarshaller approach is the technically correct way. However, the code is cumbersome to write and it's a maintenance headache syncing the fields of the domain with the marshaller.

In the spirit of being Groovy and keeping things really simple, we've been quite happy just adding a little out() method to each REST domain.

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 Response

{
   name:     "test",
   count:    2,
   routines: [{ name: "routine-1" }, { name: "routine-2" }]
}


The out() method approach makes it easy to customize the response JSON, such as adding count for the number of routines.

Upvotes: 4

Related Questions