【问题标题】:How to return specific date format as JSON in Grails?如何在 Grails 中将特定日期格式返回为 JSON?
【发布时间】:2010-10-15 23:28:15
【问题描述】:

在 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

有没有更简单的方法来做到这一点?

【问题讨论】:

    标签: json grails groovy converters


    【解决方案1】:

    有一个简单的解决方案:从 Grails 1.1 开始,转换器已被重写为更加模块化。不幸的是,我没有完成文档。它现在允许注册所谓的 ObjectMarshallers(实现 org.codehaus.groovy.grails.web.converters.marshaller.ObjectMarshaller 接口的简单 Pogo/Pojo)。

    为了实现你想要的输出,你可以在 BootStrap.groovy 中注册这样一个 ObjectMarshaller:

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

      【讨论】:

      • 将日期/时间戳实例转换为其 JSON 表示时,不会调用 toString 方法。干杯
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多