2016-11-06 6 views
1

ich eine Klasse mit einem Feld haben:@JsonFormat Deserialisierung nicht

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "PST") 
@JsonProperty("myDate") 
private Date myDate; 

Wenn ich versuche, einen JSON-String in ein Objekt deserialisieren:

ObjectMapper objectMapper = new ObjectMapper(); 

objectMapper.setTimeZone(TimeZone.getTimeZone("PST")); 

ObjectNode node = objectMapper.createObjectNode(); 
node.put("myDate", "2016-11-06"); 

Object pojo = objectMapper.treeToValue(node, SomeClass.class); 

Es schlägt fehl, mit dieser Ausnahme:

com.fasterxml.jackson.databind.JsonMappingException: Failed to parse Date value '2016-11-06' (format: "yyyy-MM-dd'T'HH:mm:ss.SSSZ"): Unparseable date: "2016-11-06" 
. 
. 
. 
Caused by: java.lang.IllegalArgumentException: Failed to parse Date value '2016-11-06' (format: "yyyy-MM-dd'T'HH:mm:ss.SSSZ"): Unparseable date: "2016-11-06" 
    at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateBasedDeserializer._parseDate(DateDeserializers.java:158) 
    at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:261) 
    at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:245) 
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:490) 
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:95) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:260) 

Sollte die Anmerkung @ JsonFormat nicht nur für die Serialisierung gelten? Zumindest habe ich das verstanden, als ich diese FAQ gelesen habe: http://wiki.fasterxml.com/JacksonFAQDateHandling. Hier kann ich keine JSON-Zeichenfolge in ein Objekt deserialisieren.

Selbst die JsonFormat java docs tut darüber reden während der Deserialisierung verwendet: http://fasterxml.github.io/jackson-annotations/javadoc/2.0.0/com/fasterxml/jackson/annotation/JsonFormat.html

Haben verstehe ich diese Funktion falsch oder bin ich etwas falsch in meinem Code zu tun?

Antwort

1

Nein, die @ JsonFormat-Annotation gilt sowohl für die Serilisierung als auch für die Deserilisation. Bei der Deinstallation wird es verwendet, um die Datetime-Zeichenfolge mit der DateFormat.parse-Methode nach datetime-Objekt zu analysieren. Bei der seralilization wird das datetime-Objekt mit der DateFormat.format-Methode zur Datumszeitfolge formatiert.

Weitere Informationen finden Sie im DateSerializer & DateDeserializers-Klassen.

Sie sollten nur 'Z' verwenden, wenn der Wert eine UTC-Zeit ist. Ändern Sie also in Ihrem Fall das Datumsformat auf "yyyy-MM-dd'T'HH: mm: ss.SSS" und übergeben Sie den Datumswert als "2016-11-06T05: 00: 35.657". Dies wird erfolgreich analysiert.

+0

Ja, ich habe mich geirrt. Ich konnte die Saite parsen, als ich "Z" in dem Muster entfernte, das ich benutzte. – shravanp

+0

Falsch. Die Serialisierung ist von dieser Anmerkung nicht betroffen. –

Verwandte Themen