2009-03-27 19 views
18

En Grails, puede utilizar los convertidores de JSON para hacer esto en el controlador:¿Cómo devolver el formato de fecha específico como JSON en Grails?

render Book.list() as JSON 

El resultado es rinden

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

Usted puede controlar la fecha de salida de realizar un ajuste en Config.groovy

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

a continuación, el resultado será una fecha javascript nativo

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

Si quiero conseguir un formato específico fecha de la siguiente manera:

"releaseDate":"06-04-2007" 

tengo que usar 'recoger', que requiere un montón de escribir:

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 

¿Existe un sencillo forma de hacer esto?

Respuesta

35

Existe una solución simple: desde Grails 1.1, los convertidores se han reescrito para que sean más modulares. Lamentablemente, no terminé la documentación para eso. Ahora permite registrar los denominados ObjectMarshallers (Pogo/Pojo's sencillos que implementan la interfaz org.codehaus.groovy.grails.web.converters.marshaller.ObjectMarshaller).

Para lograr los resultados deseados, se puede registrar una ObjectMarshaller tal en BootStrap.groovy de esa manera:

import grails.converters.JSON; 

class BootStrap { 

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

Hay varias otras maneras de personalizar la salida de los convertidores y yo haré lo mejor que hacer ponerse al día con la documentación lo antes posible.

+0

esto es impresionante – tbruyelle

1

O podría trabajar en el nivel de fecha. Puede que esto no sea exactamente lo que quieres, pero podría generar una idea para una solución que funcione de manera consistente en toda tu aplicación.

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; 
} 
+0

El método toString no se llama cuando una instancia de fecha/fecha y hora se convierte a su representación JSON. Saludos –

Cuestiones relacionadas