2009-03-27 41 views
18

Trong Grails, bạn có thể sử dụng bộ chuyển đổi JSON để làm điều này trong bộ điều khiển:Cách trả về định dạng ngày tháng cụ thể dưới dạng JSON trong Grails?

render Book.list() as JSON 

render kết quả là

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

Bạn có thể kiểm soát từ ngày đầu ra bằng cách làm cho một thiết lập trong Config.groovy

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

Sau đó, kết quả sẽ là một ngày javascript mẹ đẻ

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

Nếu tôi muốn có được một định dạng cụ thể ngày như thế này:

"releaseDate":"06-04-2007" 

tôi phải sử dụng 'thu thập', đòi hỏi rất nhiều cách gõ:

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 

Có đơn giản hơn cách để làm điều này?

Trả lời

35

Có một giải pháp đơn giản: Vì Grails 1.1, Trình biến đổi đã được viết lại thành mô-đun hơn. Thật không may tôi đã không hoàn thành tài liệu cho điều đó. Nó cho phép bây giờ để đăng ký được gọi là ObjectMarshallers (đơn giản Pogo/Pojo của thực hiện các giao diện org.codehaus.groovy.grails.web.converters.marshaller.ObjectMarshaller).

Để đạt được kết quả mong muốn của bạn, bạn có thể đăng ký như một ObjectMarshaller trong BootStrap.groovy theo cách đó:

import grails.converters.JSON; 

class BootStrap { 

    def init = { servletContext -> 
     JSON.registerObjectMarshaller(Date) { 
      return it?.format("dd-MM-yyyy") 
     } 
    } 
    def destroy = { 
    } 
} 

Có một số cách khác để tùy chỉnh đầu ra của chuyển đổi và tôi sẽ làm hết sức mình bắt kịp với tài liệu hướng dẫn càng sớm càng tốt.

+0

Điều này thật tuyệt vời – tbruyelle

1

Hoặc bạn có thể làm việc ở chính cấp độ Ngày. Điều này có thể không chính xác những gì bạn muốn nhưng nó có thể châm ngòi cho ý tưởng về giải pháp có thể hoạt động nhất quán trên toàn bộ ứng dụng của bạ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; 
} 
+0

Phương thức toString không được gọi khi thể hiện ngày/dấu thời gian được chuyển đổi sang biểu diễn JSON của nó. Chúc mừng –

Các vấn đề liên quan