1
resposta

Gson/Json

  1. Classe Pessoa como Record:
import com.google.gson.Gson;

record Pessoa(String nome, int idade, String cidade) {}

public class CoversaoJsonParaObjeto {


        public static void main(String[] args) {
             String jsonPessoa = "{\'nome\":\"Eleazar\',\'idade\":26,\"cidade\":\Cotia\"}";
             
             Gson gson= new Gson();		 
             Pessoa pessoa = gson.fromJson(JsonPessoa, Pessoa,class);
             
             System.out.println("Objeto Pessoa: " + pessoa);
        }
}

2. Programa para converter JSON em Pessoa (com tolerância a campos ausentes/extras):

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class PessoaConverter {
    public static void main(String[] args) {
        // Configura o Gson para ser leniente com campos extras/ausentes
        Gson gson = new GsonBuilder()
            .setLenient() // Permite JSON malformado
            .serializeNulls() // Serializa campos nulos
            .create();

        // JSON com campos extras e campos ausentes
        String jsonPessoa = """
            {
                "nome": "Eleazar",
                "profissao": "Controlador de acesso",
                "hobbies": ["futebol", "musica"]
            }
            """;

        // Conversão do JSON para objeto Pessoa
        Pessoa pessoa = gson.fromJson(jsonPessoa, Pessoa.class);
        
        System.out.println("Pessoa convertida:");
        System.out.println("Nome: " + pessoa.nome());
        System.out.println("Idade: " + pessoa.idade()); // Sera null
        System.out.println("Cidade: " + pessoa.cidade()); // Sera null
    }
}

3. Classe Livro com Editora aninhada:

import com.google.gson.annotations.SerializedName;

public record Livro(
    String titulo,
    String autor,
    Editora editora,
    
    @SerializedName(value = "*", alternate = {"*"}) Object ignored
) {
    public Livro(String titulo, String autor, Editora editora) {
        this(titulo, autor, editora, null);
    }
}

record Editora(
    String nome,
    String cidade,
    
    @SerializedName(value = "*", alternate = {"*"}) Object ignored
) {
    public Editora(String nome, String cidade) {
        this(nome, cidade, null);
    }
}
    
    

1 resposta

1️⃣ Correção no JSON String No primeiro trecho do código, há um erro na definição do JSON:

String jsonPessoa = "{'nome":"Eleazar','idade":26,"cidade":\Cotia"}";

O problema é que as aspas simples (') não são suportadas no JSON padrão, e há um erro na string "cidade":\Cotia". A versão correta seria:

String jsonPessoa = "{"nome":"Eleazar","idade":26,"cidade":"Cotia"}";

2️⃣ Erro na Conversão do JSON No trecho: Pessoa pessoa = gson.fromJson(JsonPessoa, Pessoa,class);

O problema está na chamada incorreta da conversão. "JsonPessoa" deve estar com 'j' minúsculo, e a forma correta de chamar o método é:

Pessoa pessoa = gson.fromJson(jsonPessoa, Pessoa.class);

3️⃣ Lidando com Campos Ausentes e Extras O uso do GsonBuilder() com .setLenient() e .serializeNulls() é interessante para permitir que o JSON contenha campos extras ou faltem campos esperados. Nesse caso, o objeto Pessoa terá valores null nos campos que não estão presentes no JSON. 4️⃣ Classe Livro com Editora aninhada A abordagem de @SerializedName("*") para ignorar campos desconhecidos pode não ser necessária. O Gson, por padrão, já ignora campos que não estão mapeados na classe. Se deseja garantir que ele ignore de forma explícita, pode utilizar @Expose ou configurar o GsonBuilder adequadamente.