Aproveitei o codigo que tinha feito para os dois primeiros desafios e o reutilizei no terceiro com leves alteracoes, agora para desserializar um JSON em uma class Book.
Desafio 3
"Crie uma classe Livro que contenha atributos como título, autor e um objeto representando a editora. Em seguida, implemente um programa que utiliza a biblioteca Gson para converter um JSON aninhado representando um livro em um objeto do tipo Livro."
Este e minha resolucao:
package com.company.app;
import com.company.app.domain.Book;
import com.company.app.service.MainService;
import com.company.app.util.GsonProvider;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
MainService gson = new MainService();
String json = """
{
"title": "Divergente",
"authors": ["Veronica Roth"],
"editor": {
"name": "Rocco",
"city": "United Kingdom",
"foundationDate": "2011-01-26",
"gender": ["Action", "Adventure", "Science Fiction", "Dystopia"]
}
}
""";
Book book = gson.fromJson(json, Book.class);
String test = GsonProvider.getGson().toJson(book);
System.out.println(test);
if (book == null) {
return;
}
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy");
System.out.printf(
"%nTitle: %s%nAuthors: %s%n%nEditor %nName: %s%nCity: %s%nFoundationDate: %s%nGender: %s%n",
book.title(),
Arrays.asList(book.authors()),
book.editor().getName(),
book.editor().getCity(),
book.editor().getFoundationDate().format(dtf),
Arrays.asList(book.editor().getGender())
);
}
}
package com.company.app.domain;
import com.company.app.domain.internal.Editor;
public record Book(String title, String[] authors, Editor editor) {
}
package com.company.app.domain.internal;
import java.time.LocalDate;
@lombok.Data
public class Editor {
String name;
String city;
LocalDate foundationDate;
String[] gender;
}
package com.company.app.service;
import com.company.app.util.GsonProvider;
import org.jetbrains.annotations.NotNull;
public class MainService {
public <T> T fromJson(@NotNull String json, @NotNull Class<T> classOfT) {
return GsonProvider.getGson().fromJson(json, classOfT);
}
public <T> String toJson(@NotNull T object) {
return GsonProvider.getGson().toJson(object);
}
}
package com.company.app.util;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Contract;
import com.google.gson.GsonBuilder;
import com.google.gson.Gson;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
@lombok.experimental.UtilityClass
public class GsonProvider {
@lombok.Getter
private final Gson gson = get();
@ApiStatus.Internal
@Contract(" -> new")
private static @NotNull Gson build() {
return new GsonBuilder().serializeNulls().create();
}
@ApiStatus.Internal
@Contract(" -> new")
private static @NotNull Gson get() {
return new GsonBuilder().registerTypeAdapter(LocalDate.class, new TypeAdapter<LocalDate>() {
@Override
public void write(JsonWriter out, LocalDate localDate) throws IOException {
out.value(localDate.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")));
}
@Override
public LocalDate read(JsonReader in) throws IOException {
return LocalDate.parse(in.nextString());
}
}).serializeNulls().create();
}
}
Saida:
Depois de tantos errors que enfrentei no primeiro desafio, este foi mel na chupeta comparado a ele.