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);
}
}