Como retornar o formato de data específico como JSON em Grails?
-
22-08-2019 - |
Pergunta
Nos Grails, você pode usar os conversores JSON para fazer isso no controlador:
render Book.list() as JSON
O resultado da renderização é
[
{"id":1,
"class":"Book",
"author":"Stephen King",
"releaseDate":'2007-04-06T00:00:00',
"title":"The Shining"}
]
Você pode controlar a data de saída para fazer uma configuração no config.groovy
grails.converters.json.date = 'javascript' // default or Javascript
Então o resultado será uma data nativa de JavaScript
[
{"id":1,
"class":"Book",
"author":"Stephen King",
"releaseDate":new Date(1194127343161),
"title":"The Shining"}
]
Se eu quiser obter um formato de data específico como este:
"releaseDate":"06-04-2007"
Eu tenho que usar 'Collect', que requer muita digitação:
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 uma maneira mais simples de fazer isso?
Solução
Existe uma solução simples: desde que o Grails 1.1 os conversores foram reescritos para serem mais modulares. Infelizmente, não terminei a documentação para isso. Ele permite agora se registrar o chamado ObjectMarshallers (simples Pogo/Pojo que implementam o org.codehaus.groovy.grails.web.converters.marshaller.ObjectMarshaller
interface).
Para alcançar a saída desejada, você pode registrar esse objectMarshaller no bootstrap.groovy dessa maneira:
import grails.converters.JSON;
class BootStrap {
def init = { servletContext ->
JSON.registerObjectMarshaller(Date) {
return it?.format("dd-MM-yyyy")
}
}
def destroy = {
}
}
Existem várias outras maneiras de personalizar a saída dos conversores e farei o meu melhor para acompanhar a documentação o mais rápido possível.
Outras dicas
Ou você pode trabalhar no próprio nível de data. Pode não ser exatamente o que você deseja, mas pode desencadear uma idéia para uma solução que funcionaria de forma consistente em todo o aplicativo.
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;
}