Как вернуть определенный формат даты в JSON в Grails?
В Grails вы можете использовать JSON-конвертеры для этого в контроллере:
render Book.list() as JSON
Результат рендеринга
[
{"id":1,
"class":"Book",
"author":"Stephen King",
"releaseDate":'2007-04-06T00:00:00',
"title":"The Shining"}
]
Вы можете управлять выходной датой, задав настройку в Config.groovy
grails.converters.json.date = 'javascript' // default or Javascript
Тогда результатом будет нативная дата javascript
[
{"id":1,
"class":"Book",
"author":"Stephen King",
"releaseDate":new Date(1194127343161),
"title":"The Shining"}
]
Если я хочу получить конкретный формат даты, например:
"releaseDate":"06-04-2007"
Мне нужно использовать 'collect', для чего требуется много набрав:
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
Есть ли более простой способ сделать это?
Ответы
Ответ 1
Существует простое решение: поскольку Grails 1.1 преобразователи были переписаны как более модульные. К сожалению, я не закончил эту документацию. Теперь он позволяет зарегистрировать так называемые ObjectMarshallers (простые Pogo/Pojo, которые реализуют интерфейс org.codehaus.groovy.grails.web.converters.marshaller.ObjectMarshaller
).
Чтобы достичь желаемого результата, вы можете зарегистрировать такой ObjectMarshaller в BootStrap.groovy следующим образом:
import grails.converters.JSON;
class BootStrap {
def init = { servletContext ->
JSON.registerObjectMarshaller(Date) {
return it?.format("dd-MM-yyyy")
}
}
def destroy = {
}
}
Существует несколько других способов настройки вывода преобразователей, и я сделаю все возможное, чтобы догнать документацию как можно скорее.
Ответ 2
Или вы могли бы работать на самом уровне даты. Это может быть не совсем то, что вы хотите, но это может спровоцировать идею решения, которое будет работать последовательно во всем приложении.
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;
}