Ukládání Java 8 LocalDateTime do JSON pomocí Jackson

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

Napsat komentář