Comment retourner le format de date spécifique JSON dans Grails?
-
22-08-2019 - |
Question
Dans Grails, vous pouvez utiliser les convertisseurs JSON pour ce faire dans le contrôleur:
render Book.list() as JSON
Le résultat rendu est
[
{"id":1,
"class":"Book",
"author":"Stephen King",
"releaseDate":'2007-04-06T00:00:00',
"title":"The Shining"}
]
Vous pouvez contrôler la date de sortie en faire un paramètre dans Config.groovy
grails.converters.json.date = 'javascript' // default or Javascript
Ensuite, le résultat sera une date javascript natif
[
{"id":1,
"class":"Book",
"author":"Stephen King",
"releaseDate":new Date(1194127343161),
"title":"The Shining"}
]
Si je veux obtenir un format de date spécifique comme celui-ci:
"releaseDate":"06-04-2007"
Je dois utiliser « Collect », ce qui nécessite beaucoup de taper:
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
Y at-il un moyen plus simple de le faire?
La solution
Il existe une solution simple: Depuis Grails 1.1 les convertisseurs ont été réécrits pour être plus modulaire. Malheureusement, je n'ai pas fini la documentation pour cela. Il permet désormais d'enregistrer soi-disant ObjectMarshallers (simple, Pogo / Pojo qui mettent en œuvre de l'interface org.codehaus.groovy.grails.web.converters.marshaller.ObjectMarshaller
).
Pour obtenir votre sortie désirée, vous pouvez enregistrer un tel ObjectMarshaller à BootStrap.groovy cette façon:
import grails.converters.JSON;
class BootStrap {
def init = { servletContext ->
JSON.registerObjectMarshaller(Date) {
return it?.format("dd-MM-yyyy")
}
}
def destroy = {
}
}
Il y a plusieurs autres façons de personnaliser la sortie des convertisseurs et je ferai de mon mieux ne rattraper la documentation dès que possible.
Autres conseils
Ou vous pouvez travailler au niveau de la date elle-même. Cela pourrait ne pas être exactement ce que vous voulez, mais il pourrait déclencher une idée d'une solution qui fonctionnerait toujours dans votre application ensemble.
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;
}