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

[Dúvida] Exercício 2

Exercício 1:

  • Crie uma classe Pessoa usando o conceito de Record em Java, com atributos como nome, idade e cidade. Em seguida, implemente um programa que utiliza a biblioteca Gson para converter um JSON representando uma pessoa em um objeto do tipo Pessoa.
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public record Pessoa1(String nome, int idade, String cidade) {
    @Override
    public String toString() {
        return "Nome: " + nome + " (" + idade + ")\n" + "Cidade: " + cidade;
    }
}

class Main {
    public static void main(String[] args) {
        String json = """
                {
                "Nome" : "Michael",
                "Idade" : 30,
                "Cidade" : "Salvador",
                }""";

        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                .create();
        Pessoa1 pessoa = gson.fromJson(json, Pessoa1.class);
        System.out.println(pessoa);
    }
}

Exercício 2:

  • Modifique o programa do Exercício anterior para permitir a conversão de um JSON mesmo se alguns campos estiverem ausentes ou se houver campos adicionais não representados no objeto Pessoa. Consulte a documentação da biblioteca Gson para flexibilizar a conversão.
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public record Pessoa1(String nome, int idade, String cidade) {
    @Override
    public String toString() {
        return "Nome: " + nome + " (" + idade + ")\n" + "Cidade: " + cidade;
    }
}

class Main {
    public static void main(String[] args) {
        String json = """
                {
                "Nome" : "Michael",
                "Idade" : 30,
                "Cidade" : "Salvador",
                "Estado" : "BA"
                }""";

        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                .setLenient()
                .create();
        Pessoa1 pessoa = gson.fromJson(json, Pessoa1.class);
        System.out.println(pessoa);
    }
}
Consegue me dizer o que mudou?

Essa resolução de utilizar o .setLenient() confesso que peguei do instrutor, porém não encontrei nada falando sobre nem na própria documentação do gson. E também por alguns testes que realizei não consegui identificar o que alterou na consulta ou na conversão dos dados.

2 respostas
solução!

Olá, Daniel! Como vai?

O que chamou atenção no seu exemplo é que o Gson já costuma ignorar campos extras por padrão. No seu JSON do exercício 2, o campo "Estado" é simplesmente desconsiderado porque não existe no record Pessoa1.

Sobre o .setLenient(), ele não foi criado para permitir campos ausentes ou adicionais, mas sim para tornar o parser mais tolerante com JSONs mal formatados, como comentários, algumas quebras de padrão e outras inconsistências. Por isso, nos testes que você fez com um JSON válido, praticamente não houve diferença no resultado da conversão.

Uma dica interessante para o futuro é testar a desserialização com campos ausentes para observar o comportamento padrão do Gson. Veja este exemplo:

String json = """
{
  "nome": "Michael"
}
""";

Pessoa1 pessoa = gson.fromJson(json, Pessoa1.class);
System.out.println(pessoa);

Neste exemplo, os campos que não forem encontrados no JSON receberão valores padrão (0 para int e null para String), permitindo que a conversão aconteça sem erro.

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

Entendi um pouco através de sua explicação então irei fazer um teste utilizando uma API, assim caso tenha alguma inconsistência no codigo JSON, eu consiga ver funcionar essa aplicação. Estava confuso pois na documentação não achava nada sobre. Obrigado também pela sugestão de teste de desserialização.

Agradeço pela atenção e disposição para responder a minha dúvida.