1
resposta

[Projeto] Desafio desserializacao em livro.

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:
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Depois de tantos errors que enfrentei no primeiro desafio, este foi mel na chupeta comparado a ele.

1 resposta

Oi, Rick! Como vai?

Ficou muito legal a forma como você reutilizou o que já tinha feito e aplicou ao novo desafio. A utilização do record em Book e a configuração do GsonProvider para lidar com LocalDate são escolhas que mostram organização e clareza na sua solução.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!