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?

War es hilfreich?

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top