example json grails groovy converters

example - groovy json



¿Cómo devolver el formato de fecha específico como JSON en Grails? (2)

Hay una solución simple: desde Grails 1.1, los convertidores se han reescrito para que sean más modulares. Lamentablemente, no terminé la documentación para eso. Ahora permite registrar los denominados ObjectMarshallers (Pogo / Pojo''s sencillos que implementan la interfaz org.codehaus.groovy.grails.web.converters.marshaller.ObjectMarshaller ).

Para lograr el resultado deseado, puede registrar dicho ObjectMarshaller en BootStrap.groovy de esa manera:

import grails.converters.JSON; class BootStrap { def init = { servletContext -> JSON.registerObjectMarshaller(Date) { return it?.format("dd-MM-yyyy") } } def destroy = { } }

Hay otras formas de personalizar el resultado de los convertidores y haré todo lo posible para ponerme al día con la documentación lo antes posible.

En Grails, puede usar los conversores JSON para hacer esto en el controlador:

render Book.list() as JSON

El resultado del render es

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

Puede controlar la fecha de salida haciendo una configuración en Config.groovy

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

Entonces el resultado será una fecha nativa de javascript

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

Si quiero obtener un formato de fecha específico como este:

"releaseDate":"06-04-2007"

Tengo que usar ''recopilar'', que requiere mucha escritura:

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

¿Hay una manera más simple de hacer esto?


O podría trabajar en el nivel de la fecha en sí. Puede que esto no sea exactamente lo que quieres, pero podría generar una idea para una solución que funcione de manera consistente en toda tu aplicación.

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