Как вернуть определенный формат даты в формате JSON в Grails?
-
22-08-2019 - |
Вопрос
В 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"
Мне нужно использовать «собрать», что требует много ввода:
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
Есть ли более простой способ сделать это?
Решение
Есть простое решение:Начиная с версии 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 = {
}
}
Существует несколько других способов настройки вывода преобразователей, и я сделаю все возможное, чтобы как можно скорее ознакомиться с документацией.
Другие советы
Или вы можете работать на самом уровне даты.Возможно, это не совсем то, что вам нужно, но это может подтолкнуть к идее решения, которое будет последовательно работать во всем вашем приложении.
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;
}