V případě, že se pokusíte uložit Java 8 LocalDateTime do formátu JSON pomocí knihovny Jackson, dostanete následující výsledek:
"from": {
"hour": 14,
"minute": 30,
"nano": 0,
"second": 0,
"monthValue": 8,
"year": 2016,
"dayOfMonth": 21,
"dayOfWeek": "SUNDAY",
"dayOfYear": 234,
"month": "AUGUST",
"chronology": {
"id": "ISO",
"calendarType": "iso8601"
}
}
Ve většině případů to asi nebude přesně to, co byste chtěli. Jackson nabízí jednoduché řešení a to registraci JavaTimeModule. Tento modul umožní správné uložení a načtení Java 8 DateTime typů.
V následujícím příkladu si vytvoříme Java objekt Reservation.java, který bude obsahovat dva Java 8 LocalDateTime from a to. Tento objekt následně převedeme do formátu JSON, uložíme do souboru, ze souboru načteme a načtený objekt zobrazíme v konzoli. Ještě upozorním, že pro zpřístupnění JavaTimeModule je třeba do pom.xml (pro Maven projekt) kromě jiného přidat i závislost na Jackson knihovně jackson-datatype-jsr310.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cz.vito</groupId> <artifactId>jackson</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>jackson</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.5</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.8.5</version> </dependency> </dependencies> </project>
Reservation.java
import java.time.LocalDateTime;
public class Reservation {
private LocalDateTime from;
private LocalDateTime to;
public Reservation() {}
public Reservation(LocalDateTime from, LocalDateTime to) {
this.from = from;
this.to = to;
}
// getters and setters
}
App.java
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
public class App {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
Reservation writeReservation = new Reservation(
LocalDateTime.of(2016, 8, 21, 14, 30),
LocalDateTime.of(2016, 8, 21, 15, 30)
);
File file = new File("file.json");
try {
objectMapper.writeValue(file, writeReservation);
} catch (IOException e) {
e.printStackTrace();
}
try {
Reservation readReservation = objectMapper.readValue(file, Reservation.class);
System.out.println("From:\t" + readReservation.getFrom());
System.out.println("To:\t" + readReservation.getTo());
} catch (IOException e) {
e.printStackTrace();
}
}
}
Všimněte si řádku objectMapper.registerModule(new JavaTimeModule()). Tímto se zpřístupní modul JavaTimeModule, který umožní správné ukládání na načítání typů z Java 8 DateTime API.
Výsledek spuštění:
From: 2016-08-21T14:30 To: 2016-08-21T15:30
Vytvořený soubor file.json
{
"from": [2016, 8, 21, 14, 30],
"to": [2016, 8, 21, 15, 30]
}