Wie kann ich ein bestimmtes Datumsformat als JSON in Grails zurückgeben?
-
22-08-2019 - |
Frage
In Grails können Sie die JSON -Konverter dazu verwenden, dies im Controller zu tun:
render Book.list() as JSON
Das Render -Ergebnis ist
[
{"id":1,
"class":"Book",
"author":"Stephen King",
"releaseDate":'2007-04-06T00:00:00',
"title":"The Shining"}
]
Sie können das Ausgabedatum steuern, indem Sie eine Einstellung in config.groovy erstellen
grails.converters.json.date = 'javascript' // default or Javascript
Dann ist das Ergebnis ein natives JavaScript -Datum
[
{"id":1,
"class":"Book",
"author":"Stephen King",
"releaseDate":new Date(1194127343161),
"title":"The Shining"}
]
Wenn ich ein bestimmtes Datumsformat wie folgt erhalten möchte:
"releaseDate":"06-04-2007"
Ich muss 'sammeln' verwenden, was viel Tippen erfordert:
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
Gibt es eine einfachere Möglichkeit, dies zu tun?
Lösung
Es gibt eine einfache Lösung: Da Grals 1.1 die Konverter als modularer umgeschrieben wurden. Leider habe ich die Dokumentation dafür nicht beendet. Es ermöglicht nun, so genannte Objektmarshaller zu registrieren (einfache Pogo/Pojo, die die implementieren org.codehaus.groovy.grails.web.converters.marshaller.ObjectMarshaller
Schnittstelle).
Um Ihre gewünschte Ausgabe zu erreichen, können Sie einen solchen Objektmarshaller in Bootstrap registrieren.
import grails.converters.JSON;
class BootStrap {
def init = { servletContext ->
JSON.registerObjectMarshaller(Date) {
return it?.format("dd-MM-yyyy")
}
}
def destroy = {
}
}
Es gibt verschiedene andere Möglichkeiten, um die Ausgabe der Konverter anzupassen, und ich werde mein Bestes geben, um die Dokumentation so schnell wie möglich zu treffen.
Andere Tipps
Oder Sie können zum Datumsstufe selbst arbeiten. Dies ist vielleicht nicht genau das, was Sie wollen, aber es könnte eine Idee für eine Lösung auslösen, die in Ihrer gesamten App konsequent funktioniert.
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;
}