2010-12-01 16 views
5

हमारे स्प्रिंग-कॉन्फ़िगर किए गए REST-server में हम जैक्सन का उपयोग किसी ऑब्जेक्ट को जेसन में बदलने के लिए करते हैं। इस ऑब्जेक्ट में कई java.util.Date ऑब्जेक्ट्स हैं।जैक्सन और जीसन के बीच की तारीख को कैसे परिवर्तित करें?

जब हम इसे जीसन की जेसन विधि का उपयोग करते हुए एंड्रॉइड डिवाइस पर deserialize करने का प्रयास करते हैं, तो हमें एक "java.text.ParseException: अवांछनीय तारीख" मिलती है। हमने 1 9 70 से मिलीसेकंड से संबंधित टाइमस्टैम्प की तारीख को क्रमबद्ध करने का प्रयास किया है, लेकिन एक ही अपवाद प्राप्त करें।

क्या जीएसन को टाइमवेम्प-स्वरूपित दिनांक जैसे 12 91158000000 को java.util.Date ऑब्जेक्ट में पार्स करने के लिए कॉन्फ़िगर किया जा सकता है?

उत्तर

6

आपको तिथियों के लिए अपना खुद का deserializer पंजीकृत करने की आवश्यकता है।

मैं नीचे एक छोटा सा उदाहरण है, जो JSON स्ट्रिंग में "23-11-2010 10:00:00" एक तिथि वस्तु को deserialized है बना लिया है: जैक्सन को

import java.lang.reflect.Type; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.JsonDeserializationContext; 
import com.google.gson.JsonDeserializer; 
import com.google.gson.JsonElement; 
import com.google.gson.JsonParseException; 


public class Dummy { 
    private Date date; 

    /** 
    * @param date the date to set 
    */ 
    public void setDate(Date date) { 
     this.date = date; 
    } 

    /** 
    * @return the date 
    */ 
    public Date getDate() { 
     return date; 
    } 

    public static void main(String[] args) { 
     GsonBuilder builder = new GsonBuilder(); 
     builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() { 

      @Override 
      public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
        throws JsonParseException { 

       SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); 
       String date = json.getAsJsonPrimitive().getAsString(); 
       try { 
        return format.parse(date); 
       } catch (ParseException e) { 
        throw new RuntimeException(e); 
       } 
      } 
     }); 
     Gson gson = builder.create(); 
     String s = "{\"date\":\"23-11-2010 10:00:00\"}"; 
     Dummy d = gson.fromJson(s, Dummy.class); 
     System.out.println(d.getDate()); 
    } 
} 
+1

यह वास्तव में प्रश्न का उत्तर नहीं देता है, है ना? प्रश्न स्पष्ट रूप से "टाइमस्टैम्प-स्वरूपित तिथियां" बताता है – Nilzor

1

के साथ संबंध है आप, न केवल संख्यात्मक (टाइमस्टैंप) और टेक्स्टुअल क्रमबद्धता (SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS) के बीच चयन कर सकते हैं, बल्कि पाठक संस्करण (SerializationConfig.setDateFormat) के लिए उपयोग करने के लिए सटीक दिनांकफॉर्मैट भी परिभाषित कर सकते हैं। तो आप जीसन पहचानने के कुछ बल का उपयोग करने में सक्षम होना चाहिए, अगर यह आईएसओ -8601 प्रारूप जैक्सन डिफ़ॉल्ट का उपयोग करने के लिए समर्थन नहीं करता है।

इसके अलावा: यदि आप जीसन पर इसका उपयोग नहीं करते हैं तो जैक्सन एंड्रॉइड पर ठीक काम करता है।

संबंधित मुद्दे