¿Cómo devolver el formato de fecha específica como JSON en Grails?
-
22-08-2019 - |
Pregunta
En Grails, puede utilizar los convertidores de JSON para hacer esto en el controlador:
render Book.list() as JSON
El resultado es rendir
[
{"id":1,
"class":"Book",
"author":"Stephen King",
"releaseDate":'2007-04-06T00:00:00',
"title":"The Shining"}
]
Se 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á un javascript fecha nativa
[
{"id":1,
"class":"Book",
"author":"Stephen King",
"releaseDate":new Date(1194127343161),
"title":"The Shining"}
]
Si quiero conseguir un formato de fecha específica como esto:
"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
¿Hay una manera más sencilla de hacer esto?
Solución
Hay una solución simple: Desde Grails 1.1 los convertidores se han reescrito para ser más modular. Desafortunadamente no terminar la documentación de ese. Permite registrar ahora llamados ObjectMarshallers (Pogo sencilla / Pojo de que implementan la interfaz org.codehaus.groovy.grails.web.converters.marshaller.ObjectMarshaller
).
Para lograr el resultado deseado, podría registrar como un ObjectMarshaller 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 no ponerse al día con la documentación lo antes posible.
Otros consejos
O se podría trabajar en el mismo nivel de Fecha. Esto podría no ser exactamente lo que quiere pero podría provocar una idea para una solución que trabajar de forma constante a través de toda la 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;
}