3
respostas

[PROBLEMA] Está imprimindo alguns valores nulos

package br.com.projeto.screematch;

import br.com.projeto.screematch.model.DadosEpisodio;
import br.com.projeto.screematch.model.DadosSerie;
import br.com.projeto.screematch.model.DadosTemporada;
import br.com.projeto.screematch.service.ConsumoAPI;
import br.com.projeto.screematch.service.ConverteDados;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

@SpringBootApplication
public class ScreematchApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(ScreematchApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        Scanner scan = new Scanner(System.in);

        // Pesquisa série
        var consumoAPI = new ConsumoAPI();
        var json = consumoAPI.obterDados("https://www.omdbapi.com/?t=supernatural&apikey=44e7b972");

//      Busca série pelo scanner
//		System.out.print("Escolha uma serie: ");
//		String busca = scan.nextLine();
//		 var json = consumoAPI.buscaDados(busca);


        // Converter um json em um objeto da classe DadosSerie para Jackson
        ConverteDados conversor = new ConverteDados();
        DadosSerie dados = conversor.obterDados(json, DadosSerie.class);
        System.out.println(dados);

        // Imprimir dados do EP
         json = consumoAPI.obterDados("https://www.omdbapi.com/?t=supernatural&Season=1&episode=1&apikey=44e7b972");
        DadosEpisodio dadosEpisodio = conversor.obterDados(json, DadosEpisodio.class);
        System.out.println(dadosEpisodio);

        List<DadosTemporada> temporadas = new ArrayList<>();

        for (int i = 1; i <= dados.totalTemporadas(); i++) {
            json = consumoAPI.obterDados("https://www.omdbapi.com/?t=supernatural&Season=" + i + "&apikey=44e7b972");
            DadosTemporada dadosTemporada = conversor.obterDados(json, DadosTemporada.class);
            temporadas.add(dadosTemporada);
        }
        temporadas.forEach(System.out::println);

    }
}
package br.com.projeto.screematch.model;

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
public record DadosTemporada(@JsonAlias ("Season")  Integer numero,
                             @JsonAlias ("Episodes") List<DadosEpisodio> episodios             
                             ) {
}
package br.com.projeto.screematch.model;

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties (ignoreUnknown = true)
public record DadosEpisodio(@JsonAlias ("Title") String tituloEpisodio,
                            @JsonAlias ("Episode") String episodio,
                            @JsonAlias ("Plot") String descricao,
                            @JsonAlias ("Season") String temporada,
                            @JsonAlias ("Runtime") String duracao,
                            @JsonAlias ("Released") String dataLancamento,
                            @JsonAlias ("Year") Integer ano,
                            @JsonAlias ("imdbRating") String avaliacao
) {
}

Quando eu peço para imprimir os dados do episódio ele consegue puxar os dados corretamente, porém com o loop de episódios e temporadas alguns valores vem nulos:

DadosEpisodio[tituloEpisodio=Pilot, episodio=1, descricao=Sam and Dean Winchester were trained by their father to hunt the creatures of the supernatural. Now, their father has mysteriously disappeared while hunting the demon that killed their mother, 22 years ago., temporada=1, duracao=44 min, dataLancamento=13 Sep 2005, ano=2005, avaliacao=8.5]
DadosTemporada[numero=1, episodios=[DadosEpisodio[tituloEpisodio=Pilot, episodio=1, descricao=null, temporada=null, duracao=null, dataLancamento=2005-09-13, ano=null, avaliacao=8.5]
3 respostas

Oi, Diego! Como vai?

O problema aparece quando tenta listar os episódios de uma temporada inteira, o que indica que o JSON da temporada não traz o mesmo nível de detalhes que a busca individual por episódio.

Uma dica interessante para o futuro é validar o JSON de resposta antes de mapear os objetos. Você pode usar um System.out.println(json); antes de converter, assim consegue comparar o que vem da API nas diferentes consultas:


System.out.println(json);

Sem acentuação: Esse comando exibe no console o JSON bruto retornado pela API, facilitando a identificação de campos ausentes.

Mas caso não consiga identificar corretamente a partir desse print da informação vinda do Json, peço que compartilhe todo o seu projeto. Recomendo que faça isso usando o GitHub.

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

O json está puxando tudo corretamente, não consegui identificar o problema.

link do repositório no GitHub: https://github.com/DiegoBalieiroDev/APISeries

Olá, Diego!

Analisando o seu código e o que é retornado na API do omdbapi, notei que você acabou confundido as informações retornadas ao buscar a série com as do episódio. Pois, o retorno das séries apresentam a seguinte estrutura:

{
"Title": "Supernatural",
"Year": "2005–2020",
"Released": "13 Sep 2005",
"Runtime": "44 min",
"Plot": "Two brothers follow their father's footsteps as hunters, fighting evil supernatural beings of many kinds, including monsters, demons, and gods that roam the earth.",
"imdbRating": "8.4",
"totalSeasons": "15"
}

Outras informações retornadas foram omitidas para visualizar apenas o necessário, porém, quase todos esses dados de retorno estão presentes no seu record de dados de episódio:

@JsonIgnoreProperties (ignoreUnknown = true)
public record DadosEpisodio(@JsonAlias ("Title") String tituloEpisodio,
                            @JsonAlias ("Episode") String episodio,
                            @JsonAlias ("Plot") String descricao,//
                            @JsonAlias ("Season") String temporada,//
                            @JsonAlias ("Runtime") String duracao,//
                            @JsonAlias ("Released") String dataLancamento,
                            @JsonAlias ("Year") Integer ano,//
                            @JsonAlias ("imdbRating") String avaliacao
) {
}

E quando vamos ver o retorno dos episódios notamos a seguinte estrutura que é quase totalmente desconectada com as informações buscadas no record:

{
"Title": "Asylum",
"Released": "2005-11-22",
"Episode": "10",
"imdbRating": "8.3",
"imdbID": "tt0713610"
},

Logo, o record DadosEpisodio deveria estar implementado da seguinte forma para condizer exatamente o que é retornado no JSON:

@JsonIgnoreProperties(ignoreUnknown = true)
public record DadosEpisodio(
        @JsonAlias("Title") String titulo,
        @JsonAlias("Released") String dataLancamento,
        @JsonAlias("Episode") String episodio,
        @JsonAlias("imdbRating") String avaliacao,
        @JsonAlias("imdbID") String imdbID
) {
}

Espero ter ajudado e fico à disposição para mais dúvidas ou problemas!