سؤال

في 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top