2013-07-15 17 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")) 

passando richiesta JSON per riposare metodo di controllo in una class.user POJO dovrebbe entrare solo in formato datetime di seguito altri saggi dovrebbe inviare un messaggio. Perché DateSerializer non sta chiamando?JSON data Serializzare in un formato personalizzato (non possono costruire un'istanza di java.util.Date da String value)

add(@Valid @RequestBody User user) 
{ 
} 

JSON:

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

classe POJO variabile

@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)); 
} 

risposta

6

Ho lo stesso problema, in modo da scrivere la data personalizzata deserializzazione con @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

Come si sta implementando questa classe CustomerDateAndTimeDeserialize? –

0
  1. Se si desidera associare una stringa JSON fino ad oggi, questo processo è chiamato "deserializzazione", non è la serializzazione.
  2. Per associare una stringa JSON alla data, creare una deserializzazione della data personalizzata, annotare "created_date" o il suo setter con @JsonDeserialize (using = YourCustomDateDeserializer.class) in cui è necessario implementare il metodo "public deserialize Date (...) "per dire a Jackson come convertire una stringa in una data.

Divertiti.

32

Annotate il vostro campo CREATED_DATE con l'annotazione JsonFormat per specificare il formato di output.

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

È tutto ciò che devi fare? Ho provato questo e non ha funzionato da solo. Forse alcune altre annotazioni sono richieste da qualche parte? – Dariusz

+1

È necessario utilizzare Jackson: http://fasterxml.github.io/jackson-annotations/javadoc/2.0.0/com/fasterxml/jackson/annotation/JsonFormat.html – Splaktar

+1

Attenzione all'utilizzo di questa annotazione. Qui è noto ** [problema] (http://stackoverflow.com/q/31822877/2650174) ** con un giorno in meno. –

0

Un altro modo è disporre di un oggetto Date personalizzato che si prenda cura della propria serializzazione.

Mentre io non credo estendendo oggetti semplici come Date, Long, ecc è una buona pratica, in questo caso particolare rende il codice facilmente leggibile, ha un unico punto in cui il formato è definito ed è un po 'più di meno compatibile con il normale oggetto 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(); 
    } 
}