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

Gson nao consegue serializar um record sem type adapter

O Gson.fromjson funcionou para instanciar o objeto titulo quando usado as anotações @SerializedName, porém quando tentei fazer pelo record do titulo, ele lança uma exception : Unable to create instance of class br.com.davi.screenmatch.modelos.TituloOmdb. Registering an InstanceCreator or a TypeAdapter for this type, or adding a no-args constructor may fix this problem.

ao pesquiser na internet encontrei em varios lugares falando sobre a necessidade de criar esse typeadapter, porém na aula nada foi falado sobre ele, nao sei se é um problema da versão que estou usando ou algo assim

2 respostas
solução!

Consegui resolver o problema mudando a versão do gson para a 2.10.1 [https://mvnrepository.com/artifact/com.google.code.gson/gson/2.10.1] Assim que eu troquei a versão ele conseguiu instanciar o Record

O problema ocorre porque Gson não consegue serializar/deserializar records do Java diretamente, pois records são classes imutáveis que não possuem um construtor sem argumentos. Para resolver isso, você precisa criar um TypeAdapter personalizado ou usar uma biblioteca alternativa que suporte records.

Solução com Gson

Aqui está um exemplo de como criar um TypeAdapter para seu record:

import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;

public record TituloOmdb(String titulo, int ano) {}

// TypeAdapter personalizado para o record
class TituloOmdbAdapter extends TypeAdapter<TituloOmdb> {
    @Override
    public void write(JsonWriter out, TituloOmdb value) throws IOException {
        out.beginObject();
        out.name("titulo").value(value.titulo());
        out.name("ano").value(value.ano());
        out.endObject();
    }

    @Override
    public TituloOmdb read(JsonReader in) throws IOException {
        String titulo = null;
        int ano = 0;

        in.beginObject();
        while (in.hasNext()) {
            switch (in.nextName()) {
                case "titulo" -> titulo = in.nextString();
                case "ano" -> ano = in.nextInt();
            }
        }
        in.endObject();
        return new TituloOmdb(titulo, ano);
    }
}

// Registrando o Adapter no Gson
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Main {
    public static void main(String[] args) {
        Gson gson = new GsonBuilder()
            .registerTypeAdapter(TituloOmdb.class, new TituloOmdbAdapter())
            .create();

        // Testando a serialização
        TituloOmdb titulo = new TituloOmdb("Exemplo de Título", 2023);
        String json = gson.toJson(titulo);
        System.out.println(json);

        // Testando a deserialização
        String jsonInput = "{\"titulo\":\"Exemplo de Título\",\"ano\":2023}";
        TituloOmdb deserializado = gson.fromJson(jsonInput, TituloOmdb.class);
        System.out.println(deserializado);
    }
}