2009-03-27 7 views
18

En Grails, vous pouvez utiliser les convertisseurs JSON pour ce faire dans le contrôleur:Comment renvoyer un format de date spécifique au format JSON dans Grails?

render Book.list() as JSON 

Render résultat 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 une mise en 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 

Est-il plus simple façon de le faire?

Répondre

35

Il existe une solution simple: Depuis Grails 1.1, les convertisseurs ont été réécrits pour être plus modulaires. Malheureusement, je n'ai pas terminé la documentation pour cela. Il permet maintenant d'enregistrer ce qu'on appelle ObjectMarshallers (simples Pogo/Pojo qui implémentent 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 faire rattraper la documentation dès que possible.

+0

c'est génial – tbruyelle

1

Ou vous pouvez travailler au niveau Date lui-même. Cela peut ne pas être exactement ce que vous voulez, mais cela pourrait déclencher une idée pour une solution qui fonctionnerait de manière cohérente dans l'ensemble de votre application.

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; 
} 
+0

La méthode toString n'est pas appelée lorsqu'une instance date/horodatage est converti en sa représentation JSON. À la votre –