Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Faça como eu fiz] Gerar Arquivo JSON

Agora é com você! Faça o mesmo procedimento que eu fiz na aula, escrevendo a sua lista de filmes em json.


Neste desafio, busquei segregar em classes distintas:


package exceptions;

public class ErroBuscaFilmeException extends RuntimeException {

        public ErroBuscaFilmeException(String msg) {
            super(msg);
    }
}

package Entities;

public class Filme {
    private String nomeFilme;
    private Integer anoDeLancamento;
    private Integer duracaoEmMinutos;

    @Override
    public String toString() {
        return "(nome = " + nomeFilme +
                ", anoDeLancamento = " + anoDeLancamento +
                ", duração(em minutos) = " + duracaoEmMinutos + ")";
    }

    public String getNomeFilme() {
        return nomeFilme;
    }

    public void setNomeFilme(String nomeFilme) {
        this.nomeFilme = nomeFilme;
    }

    public Integer getAnoDeLancamento() {
        return anoDeLancamento;
    }

    public void setAnoDeLancamento(Integer anoDeLancamento) {
        this.anoDeLancamento = anoDeLancamento;
    }

    public Integer getDuracaoEmMinutos() {
        return duracaoEmMinutos;
    }

    public void setDuracaoEmMinutos(Integer duracaoEmMinutos) {
        this.duracaoEmMinutos = duracaoEmMinutos;
    }
}

package Entities;

import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class AccessOmdb extends Filme {
    public AccessOmdb(String filme) throws IOException, InterruptedException {

        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                .setPrettyPrinting()
                .create();

        String endereco = "http://www.omdbapi.com/?t=" + filme.replace(" ", "+") + "&apikey=2669****";
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(endereco))
                .build();
        HttpResponse<String> response = client
                .send(request, HttpResponse.BodyHandlers.ofString());

        String json = response.body();
        System.out.println(json);

        Filme meuFilme = gson.fromJson(json, Filme.class);
        System.out.println(meuFilme);

        FileWriter escrita = new FileWriter("filmes.json");
        escrita.write(gson.toJson(json));
        escrita.close();
        System.out.println("O programa finalizou corretamente");
    }
}

package Entities;

public record FilmeOmdb(String nomeFilme, String anoDeLancamento, String duracaoEmMinutos) {

}

package Main;

import Entities.AccessOmdb;
import java.util.Scanner;

public class Principal {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);

        AccessOmdb filme = new AccessOmdb("");
        System.out.println("Insira o nome do filme: ");
        filme.setNomeFilme(sc.nextLine());
        try {
            AccessOmdb localizaFilme = new AccessOmdb(filme.getNomeFilme());
        } catch (RuntimeException e) {
            System.out.println("Ocorreu erro na consulta!");
            System.out.println(e.getMessage());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        sc.close();
    }
}

Gerado o arquivo JSON e as informações são salvas no arquivo:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade


Porém ocorre alguns erros anterior a geração do arquivo e em seguida é retornado o Nome do Filme, mas na apresentação das informações do Record, elas retornam vazias.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta
solução!

Olá, estudante. Tudo bem?

O seu objeto Filme não está mapeando corretamente os campos do JSON retornado pela API. No JSON, os campos são Title, Year, e Runtime, mas no seu objeto Filme, eles são nomeFilme, anoDeLancamento, e duracaoEmMinutos. Você precisa usar as anotações do Gson para mapear corretamente os campos:

import com.google.gson.annotations.SerializedName;

public class Filme {
    @SerializedName("Title")
    private String nomeFilme;

    @SerializedName("Year")
    private Integer anoDeLancamento;

    @SerializedName("Runtime")
    private String duracaoEmMinutos;

    // Resto do código...
}
  1. Note que Runtime no JSON é uma string (ex: "129 min"), então você pode precisar ajustar o tipo no seu objeto Filme para String ou fazer uma conversão ao deserializar.

  2. A primeira resposta que você recebeu foi um erro da API ("Incorrect IMDb ID"). Certifique-se de que o nome do filme está correto e que a API está recebendo a chave correta.

  3. No trecho onde você escreve no arquivo, você está usando gson.toJson(json), mas deveria ser gson.toJson(meuFilme) para gravar o objeto Filme em JSON.

Aqui está um exemplo de como ajustar a gravação:

FileWriter escrita = new FileWriter("filmes.json");
escrita.write(gson.toJson(meuFilme));
escrita.close();

Espero ter entendido e conseguido ajudar. Qualquer coisa manda aqui de novo. Bons estudos!

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