2009-03-27 10 views
18

In Grails, è possibile utilizzare i convertitori JSON per fare questo nel controller:Come restituire il formato di data specifico come JSON in Grails?

render Book.list() as JSON 

Il risultato è rendere

[ 
{"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 

allora il risultato sarà una data nativo JavaScript

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

Se voglio ottenere uno specifico formato di data così:

"releaseDate":"06-04-2007" 

devo usare 'raccolta', 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 

Esiste un semplice modo di fare questo?

risposta

35

C'è una soluzione semplice: poiché Grails 1.1 i Convertitori sono stati riscritti per essere più modulari. Sfortunatamente non ho finito la documentazione per quello. Permette ora di registrare i cosiddetti ObjectMarshallers (semplici Pogo/Pojo 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 fare recuperare la documentazione al più presto.

+0

questo è impressionante – tbruyelle

1

Oppure si potrebbe lavorare al livello Data stesso. Questo potrebbe non essere esattamente quello che vuoi ma potrebbe suscitare un'idea per una soluzione che funzionerebbe in modo coerente in tutta la tua app.

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

Il metodo toString non viene chiamato quando un'istanza data/timestamp viene convertito nella rappresentazione JSON. Saluti –