382 Stimmen

serialize/deserialize Java 8 Java.time mit Jackson JSON mapper

Wie verwende ich den Jackson JSON-Mapper mit Java 8 LocalDateTime?

org.codehaus.jackson.map.JsonMappingException: Kann den Wert des Typs [einfachen Typs, Klasse java.time.LocalDateTime] nicht aus JSON-String instanziieren; kein einzelner String-Konstruktor/Fabrikmethode vorhanden (durch Verweisreihe: MyDTO["field1"]->SubDTO["date"])

393voto

Matt Ball Punkte 343109

Es ist nicht notwendig, benutzerdefinierte Serialisierer/Deserialisierer zu verwenden. Verwenden Sie das Datumszeitmodul von jackson-modules-java8:

Datumsmodul, um Jackson dazu zu bringen, Java 8-Datum & Zeit API-Datentypen (JSR-310) zu erkennen.

Dieses Modul fügt Unterstützung für eine Reihe von Klassen hinzu:

  • Dauer
  • Instant
  • LocalDateTime
  • LocalDate
  • LocalTime
  • MonthDay
  • OffsetDateTime
  • OffsetTime
  • Periode
  • Jahr
  • Jahresmonat
  • ZonedDateTime
  • ZoneId
  • ZoneOffset

134voto

greperror Punkte 4316

Wenn Sie die ObjectMapper-Klasse von fasterxml verwenden, versteht ObjectMapper standardmäßig die LocalDateTime-Klasse nicht. Daher müssen Sie eine weitere Abhängigkeit in Ihrem Gradle/Maven hinzufügen:

compile 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.7.3'

Jetzt müssen Sie die vom dieser Bibliothek angebotene Datentyp-Unterstützung in Ihr ObjectMapper-Objekt registrieren. Dies kann wie folgt erfolgen:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();

Jetzt können Sie in Ihrem jsonString ganz einfach Ihr java.LocalDateTime-Feld wie folgt platzieren:

{
    "user_id": 1,
    "score": 9,
    "date_time": "2016-05-28T17:39:44.937"
}

Indem Sie all dies tun, wird Ihre Konvertierung von Json-Datei in Java-Objekt einwandfrei funktionieren. Sie können die Datei wie folgt lesen:

objectMapper.readValue(jsonString, new TypeReference>() {
            });

120voto

Alexander Taylor Punkte 14669

Aktualisierung: Ich lasse diese Antwort aus historischen Gründen hier stehen, aber ich empfehle sie nicht. Bitte siehe die oben akzeptierte Antwort.

Sagen Sie Jackson, dass er Ihre benutzerdefinierten [de]Serialisierungsklassen verwenden soll:

@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime ignoreUntil;

Benutzerdefinierte Klassen bereitstellen:

public class LocalDateTimeSerializer extends JsonSerializer {
    @Override
    public void serialize(LocalDateTime arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException {
        arg1.writeString(arg0.toString());
    }
}

public class LocalDateTimeDeserializer extends JsonDeserializer {
    @Override
    public LocalDateTime deserialize(JsonParser arg0, DeserializationContext arg1) throws IOException {
        return LocalDateTime.parse(arg0.getText());
    }
}

Zufällige Tatsache: Wenn ich die obigen Klassen verschachtelte und sie nicht statisch mache, ist die Fehlermeldung seltsam: org.springframework.web.HttpMediaTypeNotSupportedException: Inhaltsart 'application/json;charset=UTF-8' wird nicht unterstützt

60voto

iTake Punkte 3832

Diese Maven-Abhängigkeit wird Ihr Problem lösen:

    com.fasterxml.jackson.datatype
    jackson-datatype-jsr310
    2.13.4

Eine Sache, mit der ich gekämpft habe, ist, dass die Zeitzone von ZonedDateTime während der Deserialisierung auf GMT geändert wird. Es stellte sich heraus, dass Jackson standardmäßig durch eine aus dem Kontext ersetzt wird. Um die Zone beizubehalten, muss man dieses 'Feature' deaktivieren

Jackson2ObjectMapperBuilder.json()
    .featuresToDisable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE)

43voto

Dave Kraczo Punkte 650

Alles, was Sie wissen müssen, finden Sie in der Jackson-Dokumentation https://www.baeldung.com/jackson-serialize-dates

Ad.9 hat das Problem für mich schnell gelöst.

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X