Java 使用Gson加载对象

Java 使用Gson加载对象,java,json,reflection,gson,Java,Json,Reflection,Gson,原谅我,如果这是琐碎或不可能的,但我有一个周一早上的时刻在这里 我想创建一个方法来实现从Gson库加载一些设置对象的一些方法。基本上,我有一堆不同的设置对象,但我不想覆盖每个类的load方法,我希望有如下内容: public class ConfigLoader { public static void main(final String[] args) { final ConfigurationSettings loadedConfigSettigs =

原谅我,如果这是琐碎或不可能的,但我有一个周一早上的时刻在这里

我想创建一个方法来实现从
Gson
库加载一些设置对象的一些方法。基本上,我有一堆不同的设置对象,但我不想覆盖每个类的load方法,我希望有如下内容:

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;
    }
}
公共类ConfigLoader{
公共静态void main(最终字符串[]args){
加载的最终配置设置ConfigSetTIGS=
加载(“testSettings.json”,ConfigurationSettings.class);
最终备选配置设置备选配置设置TIGS=
加载(“testSettings2.json”,AlternativeConfigurationSettings.class);
}
公共T加载(最终输入流输入流,最终类clazz){
试一试{
如果(inputStream!=null){
最终Gson Gson=新Gson();
最终缓冲读取器=
新的BufferedReader(新的InputStreamReader(inputStream));
返回gson.fromJson(reader,clazz);
}
}捕获(最终异常e){
}
返回null;
}
}
在这里,我可以传入
InputStream
和要返回的对象的类。有没有一种简单的方法可以做到这一点(我不想为我想加载的每个类创建一个方法,也不想为每个类创建一个特定的加载程序)?

以下代码可以工作(需要Java 1.5或更高版本):

导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入com.google.gson.gson;
公共类配置加载器{
公共静态void main(最终字符串[]args){
最终配置设置loadedConfigSettigs=load(新文件InputStream(新文件(“testSettings.json”)),
ConfigurationSettings.class);
最终AlternativeConfigurationSettings alternativeConfigSettigs=load(新文件InputStream(新文件(“testSettings2.json”)),
AlternativeConfigurationSettings.class);
}
公共静态T负载(最终InputStream InputStream,最终类clazz){
试一试{
如果(inputStream!=null){
最终Gson Gson=新Gson();
最终BufferedReader读取器=新的BufferedReader(新的InputStreamReader(inputStream));
返回gson.fromJson(reader,clazz);
}
}捕获(最终异常e){
}
返回null;
}
}

问题出在哪里?代码中唯一不正确的是对象的类型,因为它不是“可类型化的”。你应该直接返回T。谢谢你指出这个疏忽。我已经修改了代码,并给了它更多的上下文来展示我想如何使用它。我基本上希望有一个加载程序加载一个对象,给定传递给它的类,而不必为每个类创建一个加载程序(因为我必须使用
class
方法)?好的,但这是可行的,对吗(除了传递字符串而不是InputStream,但我们明白你的意思)?(或者告诉我们您有什么问题)。我看不出你试图做什么和你似乎做的方式有任何问题。那么,是什么阻碍了你呢?我唯一想回避的是,我必须强制转换从
load
方法返回的每个对象(例如
public class ConfigLoader……final ConfigurationSettings loadedConfigSettigs=(ConfigurationSettings)load(“testSettings.json”,ConfigurationSettings.class)
我只是想知道是否有一种更好/更简洁的方法可以不强制转换,因为当我调用
load
方法时,我知道我期望的是什么类型的对象。按照现在编写的方式,您不必强制转换。您传递
Class
参数,作为回报,您将收到
T,这就是键入的全部意义。因此,是的,它将按照您编写的方式工作。谢谢。这确实对工作有帮助。您可以向我解释一下
T
。我不太确定这是做什么的?第一个菱形表示您将使用类型
T
,第二个菱形是您方法的实际返回类型。您还可以声明,然后这将强制使用MyConfigSettings类型的类或其子类之一。例如,您还可以声明多个类型。有关Java中泛型的更多详细信息,请参阅Java中的doc。为了获得最佳性能,不要在每次使用时都创建Gson实例。重用Gson实例更有效。Gson实例甚至不可用线程安全,因此您可以跨多个线程安全地共享一个线程!当您没有关闭
inputStream
时安全吗?
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;
    }
}