2013-07-15 5 views
16
could not read JSON: Can not construct instance of java.util.Date from String 
value '2012-07-21 12:11:12': not a valid representation("yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd")) 

एक POJO class.user में नियंत्रक विधि आराम केवल नीचे datetime अन्य बुद्धिमान प्रारूप में प्रवेश करना चाहिए json अनुरोध गुजर इसे संदेश फेंकना चाहिए। क्यों डेटसेरियलर कॉल नहीं कर रहा है?JSON serializing तिथि (स्ट्रिंग मान से java.util.Date के कहने का निर्माण नहीं किया जा सकता)

add(@Valid @RequestBody User user) 
{ 
} 

json:

{ 
    "name":"ssss", 
    "created_date": "2012-07-21 12:11:12" 
} 

POJO वर्ग चर

@JsonSerialize(using=DateSerializer.class) 
@Column 
@NotNull(message="Please enter a date")  
@Temporal(value=TemporalType.TIMESTAMP) 
private Date created_date; 

public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { 
    logger.info("serialize:"+value); 
    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    logger.info("DateSerializer formatter:"+formatter.format(value)); 
    jgen.writeString(formatter.format(value)); 
} 

उत्तर

6

मैं एक ही समस्या है, तो मैं @JsonDeserialize(using=CustomerDateAndTimeDeserialize.class)

public class CustomerDateAndTimeDeserialize extends JsonDeserializer<Date> { 

    private SimpleDateFormat dateFormat = new SimpleDateFormat(
      "yyyy-MM-dd HH:mm:ss"); 

    @Override 
    public Date deserialize(JsonParser paramJsonParser, 
      DeserializationContext paramDeserializationContext) 
      throws IOException, JsonProcessingException { 
     String str = paramJsonParser.getText().trim(); 
     try { 
      return dateFormat.parse(str); 
     } catch (ParseException e) { 
      // Handle exception here 
     } 
     return paramDeserializationContext.parseDate(str); 
    } 
} 
+0

आप इस ग्राहकडेट एंडटाइमडिसेरियलाइज क्लास को कैसे कार्यान्वित कर रहे हैं? –

0
  1. आप तारीख को JSON स्ट्रिंग बाध्य करने के लिए चाहते हैं, तो इस प्रक्रिया को "अक्रमांकन", नहीं क्रमबद्धता कहा जाता है।
  2. आज तक एक JSON स्ट्रिंग को बाध्य करने के लिए, कस्टम दिनांक deserialization, एनोटेट "बनाया_डेट" या इसके सेटर @JsonDeserialize (= yourCustomDateDeserializer.class का उपयोग करके) जहां आपको "सार्वजनिक दिनांक deserialize (...) विधि को लागू करना है, "जैक्सन को एक स्ट्रिंग को एक तारीख में परिवर्तित करने के बारे में बताने के लिए।

आनंद लें।

32

साथ एक कस्टम समय अक्रमांकन लिखने JsonFormat एनोटेशन उत्पादन प्रारूप निर्दिष्ट करने के लिए के साथ अपने CREATED_DATE क्षेत्र पर टिप्पणी करें।

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 
+2

क्या आपको यह करना है? मैंने कोशिश की और यह स्वयं ही काम नहीं किया। शायद कुछ अन्य एनोटेशन की आवश्यकता है? – Dariusz

+1

आपको जैक्सन का उपयोग करने की आवश्यकता है: http://fasterxml.github.io/jackson-annotations/javadoc/2.0.0/com/fasterxml/jackson/annotation/JsonFormat.html – Splaktar

+1

इस एनोटेशन का उपयोग करने के बारे में जागरूक रहें। यहां एक दिन के साथ ** [मुद्दा] (http://stackoverflow.com/q/31822877/2650174) ** ज्ञात है। –

0

फिर भी एक और तरीका कस्टम डेट ऑब्जेक्ट होना है जो अपने स्वयं के क्रमिकरण का ख्याल रखता है।

जबकि मैं वास्तव में नहीं लगता कि एक अच्छा अभ्यास, Date, Long, आदि की तरह साधारण वस्तुओं का विस्तार इस विशेष मामले में यह कोड आसानी से पढ़ने योग्य बनाता में रहा है, एक बिंदु जहां प्रारूप परिभाषित और नहीं बल्कि अधिक है जाता है सामान्य Date ऑब्जेक्ट के साथ कम संगत से कम।

public class CustomFormatDate extends Date { 

    private DateFormat myDateFormat = ...; // your date format 

    public CustomFormatDate() { 
     super(); 
    } 

    public CustomFormatDate(long date) { 
     super(date); 
    } 

    public CustomFormatDate(Date date) { 
     super(date.getTime()); 
    } 


    @JsonCreator 
    public static CustomFormatDate forValue(String value) { 
     try { 
      return new CustomFormatDate(myDateFormat.parse(value)); 
     } catch (ParseException e) { 
      return null; 
     } 
    } 

    @JsonValue 
    public String toValue() { 
     return myDateFormat.format(this); 
    } 

    @Override 
    public String toString() { 
     return toValue(); 
    } 
} 
संबंधित मुद्दे