2012-03-05 2 views
6

Простите меня, если это тривиально или невозможно, но у меня здесь есть утренний понедельник.Загрузите объект, используя Gson

Я хотел бы создать метод, который реализует некоторые методы из библиотеки Gson для загрузки некоторых параметров объектов. В принципе, у меня есть куча разных настроек объектов, но я не хочу Habe переопределить метод загрузки для каждого класса я хотел бы иметь что-то вроде:

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

, где я могу передать в InputStream и класс объекта, который я хочу вернуть. Есть ли простой способ сделать это (я не хочу создавать метод для каждого класса, который я хочу загрузить, а также не хочу, чтобы я создал конкретный загрузчик для каждого класса)?

+2

В чем проблема? Единственное, что неверно в вашем коде, это набирать Object, потому что оно не является «типичным». Вместо этого вы должны вернуться непосредственно T. –

+0

Спасибо за указание, что недосмотр. Я внесла поправки в код и дал ему еще один контекст, чтобы показать, как я хотел бы его использовать. Мне хотелось бы иметь один загрузчик, который загружает объект, переданный ему классу, без необходимости создавать загрузчик для каждого класса (как мне пришлось бы использовать метод класса )? –

+0

ОК, но это работает, правильно (кроме того, что вы передаете строку вместо InputStream, но мы получаем вашу точку)? (или расскажите, какая у вас проблема). Я не вижу никаких проблем в том, что вы пытаетесь сделать, и о том, как вы это делаете. Итак, что вас блокирует? –

ответ

10

Следующий код работает (требуется Java 1.5 или выше):

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

Спасибо. Это действительно к работе. Не могли бы вы объяснить мне « T'. Я не совсем уверен, что это делает? –

+0

Ну, первый бриллиант указывает, что вы собираетесь использовать тип 'T', второй - фактический тип возврата вашего метода. Вы также можете объявить , а затем это заставит использовать класс типа MyConfigSettings или один из его подклассов. Вы также можете объявить несколько типов > например. Ищите документ для дженериков в Java для получения более подробной информации. –

+0

Спасибо. Очень информативно. –