2016-05-11 11 views
10

Ich habe das Feld initiationDate, die von ToStringSerializer Klasse nach ISO-8601-Format serialisiert.LocalDateTime - Deserialisierung mit LocalDateTime.parse

@JsonSerialize(using = ToStringSerializer.class) 
private LocalDateTime initiationDate; 

Wenn ich die folgende JSON erhalten,

... 
"initiationDate": "2016-05-11T17:32:20.897", 
... 

will ich es Methode LocalDateTime.parse(CharSequence text) Fabrik deserialisieren. All meine Versuche endeten mit com.fasterxml.jackson.databind.JsonMappingException:

Kann nicht instanziiert Wert vom Typ [einfachen Typ, Klasse java.time.LocalDateTime] von String Wert ('2016-05-11T17:32:20.897'); nein single- String Errichter/Fabrik Methode

Wie erreiche ich das? Wie kann ich die Factory-Methode angeben?


EDIT:

Das Problem, indem jackson-datatype-jsr310 module das Projekt gelöst wurde und mit @JsonDeserialize mit LocalDateTimeDeserializer.

@JsonSerialize(using = ToStringSerializer.class) 
@JsonDeserialize(using = LocalDateTimeDeserializer.class) 
private LocalDateTime initiationDate; 
+1

Ich weiß nicht, dass Es verwendet 'parse', aber haben Sie die entsprechende Erweiterung [hier] (https://github.com/FasterXML/jackson-datatype-jsr310) hinzugefügt? –

+1

@StiriosDelimanolis, nein, wie löst es mein Problem? Ich muss die Factory-Methode angeben. 'LocalDateTime.parse (" 2016-05-11T17: 32: 20.897 ") funktioniert einwandfrei. – Andrew

Antwort

17

Vanilla Jackson hat keine Möglichkeit zu deserialize ein LocalDateTime Objekt von jedem JSON-String-Wert.

Sie haben ein paar Optionen. Sie können Ihre eigene JsonDeserializer erstellen und registrieren, die LocalDateTime#parse verwendet.

class ParseDeserializer extends StdDeserializer<LocalDateTime> { 
    public ParseDeserializer() { 
     super(LocalDateTime.class); 
    } 

    @Override 
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { 
     return LocalDateTime.parse(p.getValueAsString()); // or overloaded with an appropriate format 
    } 
} 
... 
@JsonSerialize(using = ToStringSerializer.class) 
@JsonDeserialize(using = ParseDeserializer.class) 
private LocalDateTime initiationDate; 

Oder Sie können Jackson's java.time extension zu Ihrem Classpath hinzufügen und registrieren die entsprechende Module mit Ihrem ObjectMapper.

objectMapper.registerModule(new JavaTimeModule()); 

und lassen Sie Jackson die Umwandlung für Sie tun. Intern verwendet dies LocalDateTime#parse mit einem der Standardformate. Glücklicherweise unterstützt es Werte wie

2016-05-11T17:32:20.897 

aus der Box.

+1

danke, der zweite Weg ist schöner für mich, ich habe es mit '@ JsonDeserialize' statt Modul Registrierung verwendet – Andrew

+0

Ja, ich ging auch den zweiten Weg: objectMapper.registerModule (new JavaTimeModule()) ;. Ich habe abgestimmt. –

2

Für diejenigen, die benutzerdefinierte Datum-Uhrzeit-Format analysieren möchten. In

1) Abhängigkeit

compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.8" 

2) Json Annotation mit Datum-Zeit-Format

public class ClientRestObject { 

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 
    private LocalDateTime timestamp; 

} 

3) Register Java8 Modul in ObjectMapper

private static ObjectMapper buildObjectMapper() { 
    ObjectMapper objectMapper = new ObjectMapper(); 
    //To parse LocalDateTime 
    objectMapper.registerModule(new JavaTimeModule()); 
    return objectMapper; 
} 
+2

leider funktioniert es :(gibt null zurück –

Verwandte Themen