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] }