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?

Était-ce utile?

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top