Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
1
respuesta

Duda con record transformación Json

Hola! Durante el video "Otra estructura para representar los datos" el instructor utiliza un record llamado "tituloOmdb.java":

public record TituloOmdb (String title, String year, String runtime){}

gracias al uso de este record y otro método aplicado en el GsonBuilder(), se lograba transformar los datos del Json a un objeto java del tipo tituloOmdb, es aquí cuando surgió una excepción durante la ejecución del código, se veía algo así:

Exception in thread "main" java.lang.AssertionError: AssertionError (GSON 2.9.0): java.lang.IllegalAccessException: Can not set final java.lang.String field com.kcire.screenmatch.modelos.TituloOmdb.title to java.lang.String
    at com.google.gson.Gson.fromJson(Gson.java:1008)
    at com.google.gson.Gson.fromJson(Gson.java:956)
    at com.google.gson.Gson.fromJson(Gson.java:905)
    at com.google.gson.Gson.fromJson(Gson.java:876)
    at com.kcire.screenmatch.principal.PrincipalConBusqueda.main(PrincipalConBusqueda.java:43)
Caused by: java.lang.AssertionError: java.lang.IllegalAccessException: Can not set final java.lang.String field com.kcire.screenmatch.modelos.TituloOmdb.title to java.lang.String
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:227)
    at com.google.gson.Gson.fromJson(Gson.java:991)
    ... 4 more

En su momento, creí que era algun error en el código que habia hecho, pero luego recorde que estaba usando una versión de Gson distinta a la del video, algo más reciente, en concreto es la versión 2.9.0, por lo que lo más probable es que haya cambiado la forma en la que se transforma un json a un objeto java.

Encontré en algunos foros que la mayoría utilizaban un objeto de tipo Class en lugar de record, eso si, con sus respectivos getters, para poder acceder a sus atributos, así que utilice esta forma para probar si de esta manera podría llegar al mismo resultado en consola que se mostraba en el video, y en efecto se logró, pero quede con la espinita de no poder haberlo hecho con record, ya que en otras publicaciones de este foro se mencionaba que el uso de record era considerado una buena practica.

Por lo anterior, recurro a este foro, para conocer si alguien pudo hacerlo utilizado record en lugar de class, o si como lo comente tuvieron que utilizar un objeto de tipo class para poder utilizar una versión más reciente de la librería Gson :D

Dejo mi clase principal y el objeto que se encarga de recibir los atributos del json, por si a alguien le puedan servir:

public class PrincipalConBusqueda {
    public static void main(String[] args) throws IOException, InterruptedException {
        Scanner entrada = new Scanner(System.in).useDelimiter("\n");
        System.out.println("Escriba el nombre de una pelicula:");
        var busqueda = entrada.nextLine();

        String direccion = "https://www.omdbapi.com/?t=" + busqueda + "&apikey=tuapikey";

        //para hacer request, utilizaremos una arquitectura cliente-servidor
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(direccion))
                .build();

        HttpResponse<String> response = client
                .send(request, HttpResponse.BodyHandlers.ofString());

        String json = response.body();
        //el body del json, toda la info de la request
        System.out.println(json);

        //ya esta añadido el jar de Gson a las /File/ProjectStructure/Modules/dependencies/+
        //seteamos la politica de recibimiento de atrbutos
        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
                .create();
        TituloOmdb miTituloOmdb = gson.fromJson(json, TituloOmdb.class);
        System.out.println(miTituloOmdb.toString());
        Titulo miTitulo = new Titulo(miTituloOmdb);
        System.out.println(miTitulo)
        ;
    }
}
public class TituloOmdb {
    private String title;
    private String year;
    private String runtime;

    // Constructor
    public TituloOmdb(String title, String year, String runtime) {
        this.title = title;
        this.year = year;
        this.runtime = runtime;
    }

    // Getters
    public String getTitle() {
        return title;
    }

    public String getYear() {
        return year;
    }

    public String getRuntime() {
        return runtime;
    }
    
    @Override
    public String toString() {
        return "TituloOmdb{" +
                "title='" + title + '\'' +
                ", year='" + year + '\'' +
                ", runtime='" + runtime + '\'' +
                '}';
    }
}
1 respuesta
solución!

Actualización

Segui avanzando un poco más en el curso y note que más adelante dieron un paso a paso para añadir la libreria de Gson al proyecto que estábamos haciendo, allí añadieron la versión 2.10.1 de Gson en la cual si funciona el record que se utiliza dentro del video:

public record TituloOmdb (String title, String year, String runtime){}

Al parecer me falto buscar un poco más y no alarmarme tan pronto, igual aprendi algo nuevo hoy y practique bastante el tema de buscar y aprender de foros y documentaciones :D