Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Deserialização customizada

Tive uns problemas na hora de usar o Gson, por isso fiz meu próprio JsonDeserializer.
Não sei se é uma boa prática fazer de forma customizada, mas acredito que ficou bom.

public class MovieDeserializer implements JsonDeserializer<Movie> {

    @Override
    public Movie deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
        JsonObject object = json.getAsJsonObject();

        String title = object.get("Title").getAsString();
        int year = object.get("Year").getAsInt();
        String director = object.get("Director").getAsString();
        String genre = object.get("Genre").getAsString();
        String description = object.get("Plot").getAsString();

        String[] runtime = object.get("Runtime").getAsString().split(" ");
        int minutes = Integer.parseInt(runtime[0]);

        return new Movie(title, year, minutes, genre, director, description);
    }
}

Dessa forma não precisei utilizar as anotações do Gson na minha classe Movie.

2 respostas
solução!

Olá, Fellipe! Como vai?

É legal saber que você está explorando a deserialização customizada com o Gson! Criar seu próprio JsonDeserializer pode ser uma ótima prática quando você precisa de um controle mais fino sobre como os dados JSON são convertidos em objetos Java, especialmente se o formato do JSON não corresponde exatamente à estrutura da sua classe.

O seu exemplo de MovieDeserializer parece bem estruturado e é uma boa abordagem quando você quer evitar o uso de anotações ou quando precisa lidar com JSONs que têm campos que não mapeiam diretamente para os atributos da sua classe.

Por exemplo, no seu caso, você está lidando com o campo "Runtime" que precisa ser convertido de uma string para um inteiro, o que é um ótimo exemplo de quando a deserialização customizada é útil.

Só um detalhe para ficar atento: se o JSON que você está consumindo pode ter valores nulos ou campos ausentes, é importante adicionar verificações para evitar exceções durante a deserialização.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Obrigado pelas dicas, eu atualizei o código para realizar duas verificações:

1 - Checar se o retorno da API teve sucesso ou não.
2 - Checar se tem algum valor nulo no Json.

public class MovieDeserializer implements JsonDeserializer<Movie> {

    @Override
    public Movie deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
        JsonObject object = json.getAsJsonObject();

        checkReturn(object);
        checkNull(object);

        String title = object.get("Title").getAsString();
        int year = object.get("Year").getAsInt();
        String director = object.get("Director").getAsString();
        String genre = object.get("Genre").getAsString();
        String description = object.get("Plot").getAsString();

        String[] runtime = object.get("Runtime").getAsString().split(" ");
        int minutes = Integer.parseInt(runtime[0]);

        return new Movie(title, year, minutes, genre, director, description);
    }

    private void checkNull(JsonObject jsonObject) {
        for(Map.Entry<String, JsonElement> element : jsonObject.entrySet()) {
            if(element.getValue().isJsonNull())
                throw new BusinessException(element + " is null");
        }
    }

    private void checkReturn(JsonObject jsonObject) {
        String response = jsonObject.get("Response").getAsString();
        if(response.equals("False")) {
            String error = jsonObject.get("Error").getAsString();
            throw new BusinessException("API request error: " + error);
        }
    }
}