2
respostas

Resolução

1/2

using System.Text.Json.Serialization;

namespace Desafios;

internal class Livro : IDetalhavel
{
    [JsonPropertyName("titulo")]
    public string? Titulo { get; set; }

    [JsonPropertyName("autor")]
    public string? Autor { get; set; }

    [JsonPropertyName("ano_publicacao")]
    public int AnoDaPublicação { get; set; }

    [JsonPropertyName("genero")]
    public string? Genero { get; set; }

    [JsonPropertyName("paginas")]
    public int QtdPaginas { get; set; }

    [JsonPropertyName("editora")]
    public string? Editora { get; set; }

    public void Detalhes()
    {
        Console.WriteLine($"{Titulo} de {Autor} tem {QtdPaginas} páginas. A obra do gênero {Genero} foi lançada em {AnoDaPublicação} pela editora {Editora}.\n");
    }
}
using System.Text.Json.Serialization;

namespace Desafios;

internal class Carro : IDetalhavel
{
    [JsonPropertyName("marca")]
    public string? Marca { get; set; }

    [JsonPropertyName("modelo")]
    public string? Modelo { get; set; }

    [JsonPropertyName("ano")]
    public int Ano { get; set; }

    [JsonPropertyName("tipo")]
    public string? Tipo { get; set; }

    [JsonPropertyName("motor")]
    public string? Motor { get; set; }

    [JsonPropertyName("transmissao")]
    public string? Transmissao { get; set; }

    [JsonPropertyName("autonomia")]
    public string? Autonomia { get; set; }

    public void Detalhes()
    {
        Console.WriteLine($"\n{Marca} {Modelo} {Ano}, {Tipo}, {Motor}, {Transmissao}{(Autonomia is not null ? " " + Autonomia : null)}.");

    }
}
using System.Text.Json.Serialization;

namespace Desafios;

internal class Pais : IDetalhavel
{
    [JsonPropertyName("nome")]
    public string? Nome { get; set; }

    [JsonPropertyName("capital")]
    public string? Capital { get; set; }

    [JsonPropertyName("populacao")]
    public long Populacao { get; set; }

    [JsonPropertyName("continente")]
    public string? Continente { get; set; }

    [JsonPropertyName("idioma")]
    public string? Idioma { get; set; }

    public void Detalhes()
    {
        Console.WriteLine("\n" + Nome);
        Console.WriteLine(Capital);
        Console.WriteLine(Populacao);
        Console.WriteLine(Continente);
        Console.WriteLine(Idioma);
    }
}
using System.Text.Json.Serialization;

namespace Desafios;

internal class Filme : IDetalhavel
{
    [JsonPropertyName("id")]
    public string? Identificacao { get; set; }

    [JsonPropertyName("rank")]
    public string? Ranking { get; set; }

    [JsonPropertyName("title")]
    public string? Titulo { get; set; }

    [JsonPropertyName("fullTitle")]
    public string? TituloCompleto { get; set; }

    [JsonPropertyName("year")]
    public string? Ano { get; set; }

    [JsonPropertyName("image")]
    public string? ImagemLink { get; set; }

    [JsonPropertyName("crew")]
    public string? ElencoLista { get; set; }

    [JsonPropertyName("imDbRating")]
    public string? NotaImDb { get; set; }

    [JsonPropertyName("imDbRatingCount")]
    public string? QuantidadeDeAvaliacoesImDb { get; set; }


    public void Detalhes()
    {
        Console.WriteLine("\n" + Identificacao.Trim());
        Console.WriteLine(Ranking.Trim());
        Console.WriteLine(Titulo.Trim());
        Console.WriteLine(TituloCompleto.Trim());
        Console.WriteLine(Ano.Trim());
        Console.WriteLine(ImagemLink.Trim());
        Console.WriteLine(ElencoLista.Trim());
        Console.WriteLine(NotaImDb.Trim());
        Console.WriteLine(QuantidadeDeAvaliacoesImDb.Trim() + "\n");

    }
}
using System.Text.Json;

namespace Desafios;

internal class JsonDesserializado
{
    public static void Detalhar<T>(string endPointLink ) where T : IDetalhavel
    {   
        
        using HttpClient client = new();
        try
        {
            string resposta = client.GetStringAsync(endPointLink).GetAwaiter().GetResult();

            var registros = JsonSerializer.Deserialize<List<T>>(resposta)!;
            
            foreach (var registro in registros )
            {
                registro.Detalhes();
            }

        }
        catch (Exception ex)
        {
            Console.WriteLine($"Temos um problema: {ex}");
        }
    }
}
2 respostas

2/2

using Desafios;

internal class Program
{
    private static void Main(string[] args)
    {

        Console.WriteLine("Filmes:");
        string url = "https://raw.githubusercontent.com/ArthurOcFernandes/Exerc-cios-C-/curso-4-aula-2/Jsons/TopMovies.json";
        JsonDesserializado.Detalhar<Filme>(url);

        Console.WriteLine("Paises:");
        url = "https://raw.githubusercontent.com/ArthurOcFernandes/Exerc-cios-C-/curso-4-aula-2/Jsons/Paises.json";
        JsonDesserializado.Detalhar<Pais>(url);

        Console.WriteLine("Carros:");
        url = "https://raw.githubusercontent.com/ArthurOcFernandes/Exerc-cios-C-/curso-4-aula-2/Jsons/Carros.json";
        JsonDesserializado.Detalhar<Carro>(url);

        Console.WriteLine("Detalhar:");
        url = "https://raw.githubusercontent.com/ArthurOcFernandes/Exerc-cios-C-/curso-4-aula-2/Jsons/Livros.json";
        JsonDesserializado.Detalhar<Livro>(url);
    }
}

Oii, Robson! Tudo bem?

É impressionante ver como você estruturou esse desafio. Você não apenas resolveu a atividade, como aplicou conceitos avançados de Generics, Interfaces e Desserialização JSON, criando um código extremamente profissional e escalável.

Sua implementação demonstra um excelente domínio da linguagem C#.

  • Uso de Generics e interfaces: A criação da interface IDetalhavel em conjunto com o método genérico Detalhar<T> é uma prática de arquitetura de alto nível. Isso permite que você use a mesma lógica de rede e desserialização para qualquer classe que implemente a interface, evitando repetição de código.
  • Mapeamento com JsonPropertyName: O uso de atributos para mapear as propriedades do JSON para nomes em C# seguindo o padrão PascalCase torna o código mais limpo e padronizado com as convenções da linguagem.
  • Tratamento de exceções: A inclusão do bloco try-catch na classe JsonDesserializado mostra uma preocupação importante com a estabilidade da aplicação ao lidar com requisições externas.
  • Manipulação de strings: Notei o cuidado no uso de Trim() na classe Filme e a verificação de nulidade com o operador condicional em Carro. São detalhes que garantem que a exibição no console seja limpa e sem erros.

Parabéns pela dedicação e pela qualidade técnica do seu projeto. Compartilhar uma estrutura dessas no fórum ajuda muito outros colegas a entenderem como organizar códigos complexos.

Bons estudos!

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