2012-03-05 21 views
6

Perdóname si esto es trivial o no es posible, pero estoy teniendo un momento de lunes por la mañana aquí.Cargar un objeto usando Gson

Me gustaría crear un método que implemente algunos métodos de la biblioteca Gson para cargar algunos objetos de configuración. Básicamente, tengo un montón de diferentes configuraciones de objetos, pero no quiero que habe reemplazar el método de carga para cada clase para que me gustaría tener algo como:

public class ConfigLoader { 
    public static void main(final String[] args) { 
     final ConfigurationSettings loadedConfigSettigs = 
      load("testSettings.json", ConfigurationSettings.class); 

     final AlternativeConfigurationSettings alternativeConfigSettigs = 
      load("testSettings2.json", AlternativeConfigurationSettings .class); 
    } 

    public T load(final InputStream inputStream, final Class<T> clazz) { 
     try { 
      if (inputStream != null) { 
       final Gson gson = new Gson(); 
       final BufferedReader reader = 
        new BufferedReader(new InputStreamReader(inputStream)); 
       return gson.fromJson(reader, clazz); 
      } 
     } catch (final Exception e) { 
     } 
     return null; 
    } 
} 

donde pueda pasar en el InputStream y la clase del objeto que quiero devolver. ¿Hay una manera simple de hacer esto (no quiero tener que crear un método para cada Clase que quiero cargar, ni quiero tener que crear un cargador específico para cada clase)?

+2

¿Cuál es el problema? Lo único que no es correcto en su código es la tipificación de Object, porque no es "tipable". Deberías devolver directamente T en su lugar. –

+0

Gracias por señalar esa supervisión. He modificado el código y le he dado más contexto para mostrar cómo me gustaría usarlo. Básicamente, me gustaría tener un cargador que cargue un objeto dado que la clase se le pasó sin tener que crear un cargador para cada clase (ya que tendría que usar el método 'Clase '). –

+0

OK, pero esto funciona, a la derecha (además del hecho de que está pasando un String en lugar de un InputStream, pero tenemos su punto). (O bien cuéntanos qué problema tienes). No veo ningún problema en lo que estás tratando de hacer y en la forma en que pareces hacerlo. Entonces, ¿qué te está bloqueando? –

Respuesta

10

Las siguientes obras de código (requiere Java 1.5 o superior):

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import com.google.gson.Gson; 


public class ConfigLoader { 
    public static void main(final String[] args) { 
     final ConfigurationSettings loadedConfigSettigs = load(new FileInputStream(new File("testSettings.json")), 
       ConfigurationSettings.class); 

     final AlternativeConfigurationSettings alternativeConfigSettigs = load(new FileInputStream(new File("testSettings2.json")), 
       AlternativeConfigurationSettings.class); 
    } 

    public static <T> T load(final InputStream inputStream, final Class<T> clazz) { 
     try { 
      if (inputStream != null) { 
       final Gson gson = new Gson(); 
       final BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
       return gson.fromJson(reader, clazz); 
      } 
     } catch (final Exception e) { 
     } 
     return null; 
    } 
} 
+0

Gracias. Eso sí lo hace para el trabajo. ¿Podría explicarme el ' T'? No estoy muy seguro de lo que está haciendo? –

+0

Bueno, el primer diamante indica que vas a usar un tipo 'T', el segundo es el tipo de devolución real de tu método. También podría declarar y esto obligaría a usar una clase de tipo MyConfigSettings o una de sus subclases. También puede declarar varios tipos > por ejemplo. Busque doc sobre genéricos en Java para más detalles –

+0

Gracias. Muy informativo. –