Domanda

In Grails, è possibile utilizzare i convertitori JSON per fare questo nel controller:

render Book.list() as JSON

Il risultato di rendering è

[
{"id":1,
 "class":"Book",
 "author":"Stephen King",
 "releaseDate":'2007-04-06T00:00:00',
 "title":"The Shining"}
]

È possibile controllare la data di uscita per fare una messa in Config.groovy

grails.converters.json.date = 'javascript' // default or Javascript

Poi il risultato sarà un javascript data nativo

[
{"id":1,
 "class":"Book",
 "author":"Stephen King",
 "releaseDate":new Date(1194127343161),
 "title":"The Shining"}
]

Se voglio ottenere un formato di data specifica in questo modo:

"releaseDate":"06-04-2007"

devo usare 'raccogliere', che richiede un sacco di battitura:

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

C'è un modo più semplice per fare questo?

È stato utile?

Soluzione

C'è una soluzione semplice: Dal momento che Grails 1.1 i convertitori sono stati riscritti per essere più modulare. Purtroppo non ho finito la documentazione per questo. Esso permette ora di registrare i cosiddetti ObjectMarshallers (semplice Pogo / Pojo di che implementano l'interfaccia org.codehaus.groovy.grails.web.converters.marshaller.ObjectMarshaller).

Per ottenere l'output desiderato, è possibile registrare un tale ObjectMarshaller in BootStrap.groovy questo modo:

import grails.converters.JSON;

class BootStrap {

     def init = { servletContext ->
         JSON.registerObjectMarshaller(Date) {
            return it?.format("dd-MM-yyyy")
         }
     }
     def destroy = {
     }
}

Ci sono molti altri modi per personalizzare l'uscita dei convertitori e io farò del mio meglio non recuperare il ritardo con la documentazione al più presto.

Altri suggerimenti

Oppure si potrebbe lavorare a livello data stessa. Questo potrebbe non essere esattamente quello che vuoi, ma potrebbe innescare l'idea di una soluzione che potrebbe funzionare in modo coerente in tutta tutta la vostra applicazione.

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top