json - غرايلز تاريخ أونمارشالينغ




grails unmarshalling (2)

إذا حصلت على جسون التالية من عميل ريستفول، كيف يمكنني أونمارشال بأناقة java.util.Date؟ (هل من الممكن دون تقديم (ويعرف أيضا باسم الثابت الترميز) الشكل، وهذا ما أعنيه بأناقة ...)

{
  "class": "url",
  "link": "http://www.empa.ch",
  "rating": 5,
  "lastcrawl" : "2009-06-04 16:53:26.706 CEST",
  "checksum" : "837261836712xxxkfjhds",
}

أنظف طريقة على الأرجح لتسجيل داتابيندر مخصص لتنسيقات التاريخ الممكنة.

import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CustomDateBinder extends PropertyEditorSupport {

    private final List<String> formats;

    public CustomDateBinder(List formats) {
        List<String> formatList = new ArrayList<String>(formats.size());
        for (Object format : formats) {
            formatList.add(format.toString()); // Force String values (eg. for GStrings)
        }
        this.formats = Collections.unmodifiableList(formatList);
    }

    @Override
    public void setAsText(String s) throws IllegalArgumentException {
        if (s != null)
            for (String format : formats) {
                // Need to create the SimpleDateFormat every time, since it's not thead-safe
                SimpleDateFormat df = new SimpleDateFormat(format);
                try {
                    setValue(df.parse(s));
                    return;
                } catch (ParseException e) {
                    // Ignore
                }
            }
    }
}

ستحتاج أيضا إلى تنفيذ بروبيرتيديتورجيسترار

import org.springframework.beans.PropertyEditorRegistrar;
import org.springframework.beans.PropertyEditorRegistry;

import grails.util.GrailsConfig;
import java.util.Date;
import java.util.List;

public class CustomEditorRegistrar implements PropertyEditorRegistrar {
    public void registerCustomEditors(PropertyEditorRegistry reg) {
        reg.registerCustomEditor(Date.class, new CustomDateBinder(GrailsConfig.get("grails.date.formats", List.class)));
    }
}          

وخلق تعريف الربيع الفول في الخاص بك غرايلز التطبيق / كونف / الربيع / resources.groovy:

beans = {
    "customEditorRegistrar"(CustomEditorRegistrar)
}

وأخيرا تحديد تنسيقات التاريخ في الخاص بك غرايلز التطبيق / كونف / Config.groovy:

grails.date.formats = ["yyyy-MM-dd HH:mm:ss.SSS ZZZZ", "dd.MM.yyyy HH:mm:ss"]

كن على علم بأن الإصدار الجديد من غرايلز 2.3+ يدعم هذا النوع من ميزة من خارج منطقة الجزاء. راجع تنسيقات التاريخ لربط البيانات

ومع ذلك، إذا كنت مضطرة لاستخدام نسخة من غرايلز قبل 2.3، يمكن تحديث CustomEditorRegistrar باستخدام التعليمات البرمجية التالية للقضاء على تحذير الإيقاف، ويستخدم أيضا التعليق التوضيحي @Component ، والذي يسمح لك لإزالة / تخطي الخطوة من إضافة الفول مباشرة في resources.groovy . أيضا لا أن أنا غيرت اسم الملكية التكوين القبور إلى grails.databinding.dateFormats، الذي يطابق الممتلكات المعتمدة الآن في غرايلز 2.3+. وأخيرا، إصداري هو .groovy، وليس ملف .java.

import javax.annotation.Resource
import org.codehaus.groovy.grails.commons.GrailsApplication
import org.springframework.beans.PropertyEditorRegistrar
import org.springframework.beans.PropertyEditorRegistry
import org.springframework.stereotype.Component

@Component
public class CustomEditorRegistrar implements PropertyEditorRegistrar {

    @Resource
    GrailsApplication grailsApplication

    public void registerCustomEditors(PropertyEditorRegistry reg){
        def dateFormats = grailsApplication.config.grails.databinding.dateFormats as List
        reg.registerCustomEditor(Date.class, new CustomDateBinder(dateFormats))
    }
}




unmarshalling