Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Projeto] Desafio: Hora da prática - Atividade 1 e 2

Resolução:

Pessoa.cs

using System.Text.Json;
using System.Threading.Tasks;

namespace DesafiosCSharp03._04Desafio
{
    public class Pessoa
    {
        public Pessoa(string? nome, int? idade, string email)
        {
            Nome = nome;
            Idade = idade;
            Email = email;
        }

        public string? Nome { get; }
        public int? Idade { get; }
        public string Email { get; }



        public void CriarArquivoJSON()
        {
            string json = JsonSerializer.Serialize( new
            {
                Nome,
                Idade,
                Email
            });
            string nomeDoArquivo = $"dados-{Nome}.json";

            File.WriteAllText(nomeDoArquivo, json);

            Console.WriteLine();
            Console.WriteLine($"Arquivo criado com sucesso\n" +
                $"{Path.GetFullPath(nomeDoArquivo)}");
            Console.WriteLine();
        }

        public void ConvertendoArquivoJSON(string nomeDoArquivo)
        {
            
                try
                {
                    if (File.Exists(nomeDoArquivo))
                    {
                        // Ler conteúdo do arquivo JSON
                        string resposta = File.ReadAllText(nomeDoArquivo);
                        // Desserializar JSON para objeto Pessoa
                        Pessoa pessoa = JsonSerializer.Deserialize<Pessoa>(resposta)!;

                        Console.WriteLine($"Exibindo informações de {pessoa.Nome}");
                        Console.WriteLine($"\nNome: {pessoa.Nome}");
                        Console.WriteLine($"Idade: {pessoa.Idade}");
                        Console.WriteLine($"Email: {pessoa.Email}");
                    }
                    else
                    {
                        Console.WriteLine($"O arquivo {nomeDoArquivo} não existe.");
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Temos um erro: {ex.Message}");
                }
            
        }
    }
}

Program.cs

//1)Criar um programa que permite ao usuário inserir informações de uma pessoa (nome, idade, e e-mail), serializa essas informações em formato JSON e salva em um arquivo.

using DesafiosCSharp03._04Desafio;

var pessoa1 = new Pessoa("Chris", 20, "email.com");

pessoa1.CriarArquivoJSON();




//02. Criar um programa que lê um arquivo JSON contendo informações de uma pessoa,
//desserializa essas informações e exibe na tela.

pessoa1.ConvertendoArquivoJSON("dados-Chris.json");
1 resposta

Olá, Christopher. Como vai?

Parabéns pela excelente resolução do desafio! O seu código está muito bem estruturado e cumpre com maestria os objetivos propostos na atividade de manipulação de arquivos e serialização com a biblioteca System.Text.Json.

A forma como você dividiu as responsabilidades do código, isolando as propriedades e comportamentos na classe Pessoa e realizando a chamada dos métodos no Program.cs, demonstra uma ótima compreensão de Orientação a Objetos.

Pontos Fortes do seu Código

  • Tratamento de Exceções (try-catch): Excelente iniciativa ao implementar o bloco de tratamento de erros no método ConvertendoArquivoJSON. Quando lidamos com leitura e escrita de arquivos (File I/O), estamos sempre sujeitos a imprevistos (arquivos corrompidos, falta de permissão na pasta, etc.), e o seu código evita que o programa trave.
  • Validação de Existência (File.Exists): Antes de ler o arquivo, você verifica se ele realmente está no diretório. Essa é uma ótima prática de programação defensiva.
  • Uso de Tipos Anônimos na Serialização: No método CriarArquivoJSON, você usou um objeto anônimo new { Nome, Idade, Email } dentro do Serialize. Ficou ótimo e garantiu um JSON limpo!

Uma Sugestão de Melhoria Técnica: O Construtor e a Desserialização

Ao testar a desserialização de arquivos JSON complexos ou mais restritos, o JsonSerializer.Deserialize<Pessoa> pode encontrar problemas se a classe não possuir um construtor padrão (sem parâmetros) ou se o nome dos parâmetros no construtor atual não baterem exatamente (considerando o case-sensitive) com os campos do JSON.

Na sua classe Pessoa, o construtor recebe (string? nome, int? idade, string email).

  • Repare que os parâmetros começam com letras minúsculas (nome, idade), mas as propriedades da classe começam com maiúsculas (Nome, Idade).
  • O serializador moderno do .NET é inteligente o suficiente para conectar isso na maioria das vezes, mas para garantir compatibilidade total e evitar que as propriedades venham vazias (null) após a leitura, uma boa prática é expor um construtor vazio para o serializador ou utilizar propriedades públicas com o inicializador { get; set; }.

Se o seu código em algum momento apresentar campos vazios na leitura, você pode ajustar a classe adicionando um construtor vazio explícito ou decorando o seu construtor principal com o atributo [JsonConstructor]. Veja o exemplo:

using System.Text.Json.Serialization;

namespace DesafiosCSharp03._04Desafio
{
    public class Pessoa
    {
        // Força o JsonSerializer a usar este construtor específico se necessário
        [JsonConstructor]
        public Pessoa(string? nome, int? idade, string email)
        {
            Nome = nome;
            Idade = idade;
            Email = email;
        }

        // ... restante do seu código
    }
}

Outro detalhe super legal que você utilizou foi o Path.GetFullPath(nomeDoArquivo). Exibir o caminho completo onde o arquivo foi salvo no computador ajuda demais na hora de testar e debugar o projeto localmente.

Continue com esse ótimo ritmo de estudos e implementações!

Espero que possa ter lhe ajudado!