Question

In Grails, you can use the JSON converters to do this in the controller:

render Book.list() as JSON

The render result is

[
{"id":1,
 "class":"Book",
 "author":"Stephen King",
 "releaseDate":'2007-04-06T00:00:00',
 "title":"The Shining"}
]

You can control the output date by make a setting in Config.groovy

grails.converters.json.date = 'javascript' // default or Javascript

Then the result will be a native javascript date

[
{"id":1,
 "class":"Book",
 "author":"Stephen King",
 "releaseDate":new Date(1194127343161),
 "title":"The Shining"}
]

If I want to get a specific date format like this:

"releaseDate":"06-04-2007"

I have to use 'collect', which requires a lot of typing:

return Book.list().collect(){
  [
      id:it.id,
      class:it.class,
      author:it.author,
      releaseDate:new java.text.SimpleDateFormat("dd-MM-yyyy").format(it.releaseDate),
      title:it.title
  ]
} as JSON

Is there a simpler way to do this?

Was it helpful?

Solution

There is a simple solution: Since Grails 1.1 the Converters have been rewritten to be more modular. Unfortunately I didn't finish the documentation for that. It allows now to register so called ObjectMarshallers (simple Pogo/Pojo's that implement the org.codehaus.groovy.grails.web.converters.marshaller.ObjectMarshaller interface).

To achieve your desired output, you could register such an ObjectMarshaller in BootStrap.groovy that way:

import grails.converters.JSON;

class BootStrap {

     def init = { servletContext ->
         JSON.registerObjectMarshaller(Date) {
            return it?.format("dd-MM-yyyy")
         }
     }
     def destroy = {
     }
}

There are several other ways to customize the output of the Converters and I'll do my best do catch up with the documentation asap.

OTHER TIPS

Or you could work at the Date level itself. This might not be exactly what you want but it could spark an idea for a solution that would work consistently across your whole app.

def doWithDynamicMethods = {ctx ->

  def customDateToString = {->
        def dateFormat = "dd MMM yyyy"
        def timeFormat = "hh:mm:ss a"

        def timeCheck = new java.text.SimpleDateFormat("hh:mm:ss SSS a")
        def formattedTime = timeCheck.format(delegate)
        def formatString = dateFormat
        if (formattedTime != "12:00:00 000 AM") 
                              formatString = "$formatString $timeFormat"
        def formatter = new java.text.SimpleDateFormat("$formatString")
        formatter.format(delegate)
    }

    Date.metaClass.toString = customDateToString;
    java.sql.Timestamp.metaClass.toString = customDateToString;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top