Подтвердить что ты не робот

Как вернуть определенный формат даты в 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

Есть ли более простой способ сделать это?

4b9b3361

Ответ 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;
}