2012-03-05 11 views
6

これは簡単ではありませんが、私はここで月曜日の朝の午前を過ごしています。Gsonを使用してオブジェクトをロード

いくつかの設定オブジェクトをロードするために、Gsonライブラリからいくつかのメソッドを実装するメソッドを作成したいと思います。基本的に、私は別の設定オブジェクトの束を持っているが、私は、私のようなもの持っているしたいと思いますし、各クラスのloadメソッドをオーバーライドするhabeしたくない:

私は InputStreamに渡すことができます
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; 
    } 
} 

をそして私が戻したいオブジェクトのクラス。これを行う簡単な方法はありますか(クラスをロードできるようにするメソッドを作成する必要はなく、クラスごとに特定のローダを作成する必要もありません)。

+2

問題は何ですか?あなたのコードで正しくない唯一のものは、 "typable"ではないので、Objectの型付けです。代わりにTに直接戻ってください。 –

+0

監督を指摘してくれてありがとう。私はコードを修正し、どのように私がそれを使用したいかを示すいくつかの文脈を与えました。私は基本的にクラスを渡したオブジェクトをロードするローダーを各クラスにローダーを作成することなく渡すことができます( 'Class 'メソッドを使用する必要があります)。 –

+0

OKですが、これはうまくいきます(InputStreamの代わりにStringを渡すという事実以外にも、あなたの意見があります)。 (あるいは、あなたがどんな問題を抱えているか教えてください)。私はあなたがしようとしていることに、あなたがそれをやっているように見えることに何の問題も見ません。それで、あなたを塞いでいるのは何ですか? –

答えて

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'を使うことを示し、第2のダイヤモンドはあなたのメソッドの実際の戻りタイプです。また、を宣言すると、MyConfigSettings型またはそのサブクラスの1つのクラスを強制的に使用します。また、複数のタイプ>を宣言することもできます。 Javaのジェネリックスのドキュメントを参照してください。 –

+0

ありがとうございます。非常に有益。 –