Ayuda a Deserializar JSON con GSON

Hola les cuento que hago la peticion a una API de Yahoo (http://developer.yahoo.com/geo/placefinder/guide/examples.html) con "java.net.URL" la cual me responde en formato JSON la conexion la hace sin problemas y obtiene el resultado bien... el caso esta en que tengo que deserealizar con GSON pero no lo he conseguido, agrego la respuesta y la forma en que trato de deserealizarlo. Espero puedan darme una mano.

Respuesta de la API Yahoo.

{"ResultSet":
  {"version":"1.0",
  "Error":0,
  "ErrorMessage":"No error",
  "Locale":"en_US",
  "Quality":40,
  "Found":1,
  "Results":[
  {"quality":40,
    "latitude":"37.779160",
    "longitude":"-122.420049",
    "offsetlat":"37.779160",
    "offsetlon":"-122.420049",
    "radius":5000,
    "name":"",
    "line1":"",
    "line2":"San Francisco,
     CA"
,
    "line3":"",
    "line4":"United States",
    "house":"",
    "street":"",
    "xstreet":"",
    "unittype":"",
    "unit":"",
    "postal":"",
    "neighborhood":"",
    "city":"San Francisco",
    "county":"San Francisco County",
    "state":"California",
    "country":"United States",
    "countrycode":"US",
    "statecode":"CA",
    "countycode":"",
    "uzip":"94102",
    "hash":"C1D313AD706E3B3C",
    "woeid":12587707,
    "woetype":9}]
     }
    }

Aqui el codigo de como trato de deserealizar la respuesta de la API

No coloque el codigo que hace la conexion URL, unicamente la parte del GSON, esta clase manda a llamar a la clase LocationAddress que contiene las variables para la deserealizacion

Gson gson = new Gson();
LocationAddress fromJson = gson.fromJson( result,LocationAddress.class);
System.out.println("Ver mi resultado"+fromJson.getResultset());

Aqui el codigo de LocationAddress, que es donde esta el problema ya que no se si esa sea la forma correcta de ordenar.

public class LocationAddress {
    private ResultSet ResultSet;

    public ResultSet getResultset() {
                return ResultSet;
        }

        public void setResultset(ResultSet resultset) {
                this.ResultSet = resultset;
        }

        public  class ResultSet{
        private String version;
        private String Error;
        private String ErrorMessage;
        private String Locale;
        private String Quality;
        private String Found;

       private List<Results>  results;

        public String getVersion() {
                return version;
        }

        public void setVersion(String version) {
                this.version = version;
        }

        public String getError() {
                return Error;
        }

        public void setError(String error) {
                Error = error;
        }

        public String getErrorMessage() {
                return ErrorMessage;
        }

        public void setErrorMessage(String errorMessage) {
                ErrorMessage = errorMessage;
        }

        public String getLocale() {
                return Locale;
        }

        public void setLocale(String locale) {
                Locale = locale;
        }

        public String getQuality() {
                return Quality;
        }

        public void setQuality(String quality) {
                Quality = quality;
        }

        public String getFound() {
                return Found;
        }

        public void setFound(String found) {
                Found = found;
        }

        public List<Results> getResults() {
                return results;
        }

        public void setResults(List<Results> results) {
                this.results = results;
        }  
       
    }
   
    public static class Results{
     private String quality;
     private String latitude;
     private String longitude;
     private String offsetlat;
     private String offsetlon;
     private String radius;
     private String name;
     private String line1;
     private String line2;
     private String line3;
     private String line4;
     private String house;
     private String street;
     private String xstreet;
     private String unittype;
     private String unit;
     private String postal;
     private String neighborhood;
     private String city;
     private String county;
     private String state;
     private String country;
     private String countrycode;
     private String statecode;
     private String countycode;
     private String uzip;
     private String hash;
     private String woeid;
     private String woetype;
       
     
        public String getOffsetlat() {
                return offsetlat;
        }
        public void setOffsetlat(String offsetlat) {
                this.offsetlat = offsetlat;
        }
        public String getOffsetlon() {
                return offsetlon;
        }
        public void setOffsetlon(String offsetlon) {
                this.offsetlon = offsetlon;
        }
        public String getRadius() {
                return radius;
        }
        public void setRadius(String radius) {
                this.radius = radius;
        }
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public String getLine1() {
                return line1;
        }
        public void setLine1(String line1) {
                this.line1 = line1;
        }
        public String getLine2() {
                return line2;
        }
        public void setLine2(String line2) {
                this.line2 = line2;
        }
        public String getLine3() {
                return line3;
        }
        public void setLine3(String line3) {
                this.line3 = line3;
        }
        public String getLine4() {
                return line4;
        }
        public void setLine4(String line4) {
                this.line4 = line4;
        }
        public String getHouse() {
                return house;
        }
        public void setHouse(String house) {
                this.house = house;
        }
        public String getStreet() {
                return street;
        }
        public void setStreet(String street) {
                this.street = street;
        }
        public String getXstreet() {
                return xstreet;
        }
        public void setXstreet(String xstreet) {
                this.xstreet = xstreet;
        }
        public String getUnittype() {
                return unittype;
        }
        public void setUnittype(String unittype) {
                this.unittype = unittype;
        }
        public String getUnit() {
                return unit;
        }
        public void setUnit(String unit) {
                this.unit = unit;
        }
        public String getPostal() {
                return postal;
        }
        public void setPostal(String postal) {
                this.postal = postal;
        }
        public String getNeighborhood() {
                return neighborhood;
        }
        public void setNeighborhood(String neighborhood) {
                this.neighborhood = neighborhood;
        }
        public String getCity() {
                return city;
        }
        public void setCity(String city) {
                this.city = city;
        }
        public String getCounty() {
                return county;
        }
        public void setCounty(String county) {
                this.county = county;
        }
        public String getState() {
                return state;
        }
        public void setState(String state) {
                this.state = state;
        }
        public String getCountry() {
                return country;
        }
        public void setCountry(String country) {
                this.country = country;
        }
        public String getCountrycode() {
                return countrycode;
        }
        public void setCountrycode(String countrycode) {
                this.countrycode = countrycode;
        }
        public String getStatecode() {
                return statecode;
        }
        public void setStatecode(String statecode) {
                this.statecode = statecode;
        }
        public String getCountycode() {
                return countycode;
        }
        public void setCountycode(String countycode) {
                this.countycode = countycode;
        }
        public String getUzip() {
                return uzip;
        }
        public void setUzip(String uzip) {
                this.uzip = uzip;
        }
        public String getHash() {
                return hash;
        }
        public void setHash(String hash) {
                this.hash = hash;
        }
        public String getWoeid() {
                return woeid;
        }
        public void setWoeid(String woeid) {
                this.woeid = woeid;
        }
        public String getWoetype() {
                return woetype;
        }
        public void setWoetype(String woetype) {
                this.woetype = woetype;
        }
                public String getQuality() {
                        return quality;
                }
                public void setQuality(String quality) {
                        this.quality = quality;
                }
                public String getLatitude() {
                        return latitude;
                }
                public void setLatitude(String latitude) {
                        this.latitude = latitude;
                }
                public String getLongitude() {
                        return longitude;
                }
                public void setLongitude(String longitude) {
                        this.longitude = longitude;
                }
     
     
       
    }
}

Espero puedan darme una mano para la correcta deserealizacion del JSON ya que lo he intentado bastante y no logro hacerlo....

Salu2

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

JSON Deserializacion usando GSON

Pues leyendo la documentacion encontré que automaticamente lo hace GSON.

Lo que hice fue crear una clase Persona que definia nombre, edad, hijos y finalmente una clase en la cual tenia como propiedad a esa clase Persona

  
ContenedorPersona.java

@ToString
public class ContenedorPersona{

        @Getter(AccessLevel.PUBLIC) @Setter(AccessLevel.PUBLIC)
        private String nombre;
       
        @Getter(AccessLevel.PUBLIC) @Setter(AccessLevel.PUBLIC)
        private int edad;
       
        @Getter(AccessLevel.PUBLIC) @Setter(AccessLevel.PUBLIC)
        Persona[] hijos;
       
}

  
Contenedor.java

@ToString
public class Contenedor {
       
        @Getter(AccessLevel.PUBLIC) @Setter(AccessLevel.PUBLIC)
        Persona persona;

}

  
Usé tu mismo archivo de respuesta solo que lo acorte y le puse otros atributos, pero es la misma estructura que tienes

{
        "persona":

        {
                "nombre":"Pepito",
                "edad":99,
                "hijos":[
                        {
                                "nombre":"hugo",
                                "edad":1
                        },
                        {
                                "nombre":"paco",
                                "edad":2
                        },
                        {
                                "nombre":"luis",
                                "edad":3
                        }
                ]
        }
}

  
Para leer el archivo JSON:

BufferedReader archivoJsonBufferedReader = new BufferedReader(new FileReader(ubicacion));

ahora para hacer que GSON haga la magia:

ContenedorPersona objeto = gson.fromJson(archivoJsonBufferedReader, ContenedorPersona.class);

  
Si te das cuenta, no tienes que hacer mas cosa que asignar el tipo del Objeto al que quieres que GSON realice la deserializacion, obviamente hay que cuidar que los nombres de los atributos de la clase sean exactamente igual nombrados que los de tu archivo JSON.
   
Por cierto, agregué anotaciones de Lombook (me da hueva hacer getters y setters). Ah y puedes hacer System.out.println(objeto); para ver como se deserealizo tu JSON al objeto ContenedorPersona. En mi caso la salida fue:

ObjetoJson(persona=Persona(nombre=Pepito, edad=99, hijos=[Persona(nombre=hugo, edad=1, hijos=null), Persona(nombre=paco, edad=2, hijos=null), Persona(nombre=luis, edad=3, hijos=null)]))
Imagen de ingscjoshua

Asi es...

como dice java.daba.doo asi se hace solo recuerda que el documento de respuesta siempre debe contener la misma estructura porque si cambia la estructura tu clase de parseo ya no funcionara asi que ojo con eso

Lo revisare por la tarde

Hola java.daba.doo gracias por la respuesta por la noche revisare, haber si lo comprendo...

Segun veo hiciste pruebas con codigo, podrias pasarme los archivos para asi pasarlos a mi eclipse e ir revisandolos y adaptarlos a lo que necesito, perdona la inprudencia pero he tardado en esto y esto agilizaria mas...

Salu2

No lo he conseguido

Hola que pena decirlo pero no he logrado Deserealizar el JSON apesar de lo comentado por java.daba.doo
No se si puedieran explicar mas a detalle el ejemplo dado y ya en base a esto poder trabajar con las otras respuestas.

mis dudas son que menciona una clase Persona pero en el codigo no hay codigo de esta pero si lo pone como propiedad en

 
public class Contenedor {
       
        @Getter(AccessLevel.PUBLIC) @Setter(AccessLevel.PUBLIC)
        Persona persona;
}

y en esta otra me marca que la clase PersonaBean[] hijos; no existe

public class ContenedorPersona{

        @Getter(AccessLevel.PUBLIC) @Setter(AccessLevel.PUBLIC)
        private String nombre;
       
        @Getter(AccessLevel.PUBLIC) @Setter(AccessLevel.PUBLIC)
        private int edad;
       
        @Getter(AccessLevel.PUBLIC) @Setter(AccessLevel.PUBLIC)
        PersonaBean[] hijos;
}

Agradesco las respuestas
Salu2

Fe de erratas

Si, me equivoque... Persona y PersonaBean eran lo mismo, lo que pasa es que a veces edito cosas cuando estoy publicando.

Lo del atributo persona, revisa bien mi JSON, es lo primero que aparece:

{
        "persona":

        {

Por que no tomas mi codigo, le cambias los nombres y le agregas las propiedades, con la misma estructura porque yo use la que tenias.

Haber si comprendi

Hola java.daba.doo gracias por la pronta respuesta...
Antes de comenzar a tirar codigo quiero dejar en claro mis ideas aca te las publico y me dices si es asi..

1.- Necesito tres clases ContenedorPersona, Contenedor y Persona?

2.- La clase Persona es igual a la clase ContenedorPersona pero la clase Persona sera quien controle lo que va dentro del Array es asi? se me ocurre que quedaria asi...

public class Persona{

        private String nombre;
        private int edad;

     //Con sus respectivos Setters y getters  
}

3.- La otras clases quedarian asi?

public class ContenedorPersona{

        private String nombre;
        private int edad;
        Persona[] hijos;
 
}

public class Contenedor {

        Persona persona;

//Y mi duda es sobre si  aqui llevaria el main()
}

y la otra duda es en donde deberia colocar el metodo main() con el codigo de ContenedorPersona objeto = gson.fromJson(archivoJsonBufferedReader, ContenedorPersona.class); todo lo que se necesite para leer la respuesta?

Nota: Estoy utilizando tu ejemplo, he creado un archivo con la estructura del JSOn que utilizas y leo este archivo , pues me aprece muy bueno para comprender y asi pasar a trabajar con la respuesta que tengo.

Perdona el fastidio pero llevo escasas dos semanas en Java y me estoy adaptando apenas, agradesco muchisimo tu ayuda eres muy amable
Salu2

Si, hay error en esas lineas

Creo que modifiqué cosas que no debí modificar, la cosa es que Contenedor y ContenedorPersona pero editandolo aqui le agregué o quite unapalabra...

Subo al github el codigo que hice. Son dos beans (ContenedorPersonaBean y PersonaBean). La clase que hace el parseo es JsonReader

Hay una clase de prueba que se llama JsonReaderTest

Baja todo el proyecto Chachareando

  


Editado:
La clase JsonReader ya tiene un metodo para obtener un JSON desde web.

Gracias

Hola java.daba.doo

Me has ayudado muchisimo estoy trabajando con esto y estudiando para conocer mas sobre el mundo Java.

Muchas gracias por tu ayuda y atencion

Salu2