3
respostas

valores null no terceiro exercício.

Bom dia, estou tendo dificuldade para descobrir onde errei na terceira atividade proposta, sempre que faço o System.out.Println do Livro após o fromJson os valores ficam dando null, mesmo tendo importado o gson corretamente e feito a atividade exatamente como na resolução.

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

public class ConversãoJsonParaObjeto {
    public static void main(String[] args) {


        String jsonLivro = "{\"titulo\":\"O conde de Monte Cristo\",\"autor\":\"Alexandre Dumas\",\"editora\":{\"nome\":\"Martin Claret\",\"Cidade\":\"Rio de Janeiro\"}}";
        Gson gson2 = new Gson();
        Livro livro1 = gson2.fromJson(jsonLivro,Livro.class);
        System.out.println(livro1);

    }
}
public record Livro(String Titulo,String Autor, Editora Editora) {




}
public record Editora(String nome, String cidade) {
}
3 respostas

Olá, Breno! Como vai?

Pelo que pude analisar no código que você compartilhou, o problema parece estar na diferença entre a capitalização das variáveis no JSON e na classe Livro. No JSON, você usou a primeira letra minúscula para os nomes dos campos (ex: "titulo", "autor"), enquanto na classe Livro, você usou a primeira letra maiúscula (ex: "Titulo", "Autor").

O Gson é sensível a maiúsculas e minúsculas, então ele considera "titulo" e "Titulo" como campos diferentes. Por isso, quando você tenta converter o JSON para a classe Livro, o Gson não consegue encontrar os campos correspondentes e retorna null.

Para resolver esse problema, você pode alterar a primeira letra dos nomes dos campos na classe Livro para minúscula. Aqui está como ficaria:

public record Livro(String titulo, String autor, Editora editora) {}

E também na classe Editora:

public record Editora(String nome, String cidade) {}

Depois disso, o Gson deve ser capaz de converter corretamente o JSON para a classe Livro.

Espero ter ajudado e bons estudos!

Boa tarde, funcionou corretamente obrigado, mas gostaria de tirar uma outra dúvida. Antes de colocar as primeiras letras em minúsculo, testei fazer um new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create() para que minúsculo ou maiúsculo não fizesse diferença, porém os valores continuaram dando null, por que?

Olá novamente, Breno!

Ótima pergunta! Quando você utiliza o new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create(), você está configurando o Gson para esperar que os nomes dos campos no JSON sigam a convenção de nomenclatura Upper Camel Case, onde a primeira letra de cada palavra é maiúscula.

No entanto, o seu JSON utiliza a convenção de nomenclatura Lower Camel Case, onde a primeira letra da primeira palavra é minúscula, e as primeiras letras das palavras subsequentes são maiúsculas. Portanto, mesmo com essa configuração no Gson, ele ainda espera que os nomes dos campos no JSON sigam a convenção Upper Camel Case.

Para que a configuração do FieldNamingPolicy.UPPER_CAMEL_CASE funcione corretamente, você precisaria ajustar os nomes dos campos no JSON para seguir a convenção Upper Camel Case. Como alternativa, quando você não quer se preocupar com a capitalização, pode usar FieldNamingPolicy.IDENTITY, que mantém os nomes dos campos como estão no JSON.

Assim, se quiser fazer funcionar com o UPPER_CAMEL_CASE, você precisaria ajustar o JSON para algo assim:

{
  "Titulo": "O conde de Monte Cristo",
  "Autor": "Alexandre Dumas",
  "Editora": {
    "Nome": "Martin Claret",
    "Cidade": "Rio de Janeiro"
  }
}

Espero que isso esclareça a dúvida! Se tiver mais perguntas, estou à disposição.