gson 如何从HashMap〈String,Object>中获取Object的类类型?

uyhoqukh  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(239)

我有4个不同的散列表,它们的值有不同的类类型。
(散列表〈字符串,类1〉,散列表〈字符串,类2〉,散列表〈字符串,类3〉,散列表〈字符串,类4〉)
每个类在resources文件夹中都有各自的目录,其中包含一组Json文件。我希望将目录中的所有Json文件反序列化为正确的类类型,并将它们存储在作为参数输入的HashMap中。
Gson需要一个类类型的输入,我在这里写了#OBJECTCLASS#来创建一个对象。我怎样才能从作为方法参数输入的HashMap中获得这个输入呢?

//load a hashmap with the objects saved in its resource file
    public static void loadObjsFromDirectory(HashMap<String, Object> map, String directoryPath) {
        File[] files = new File(directoryPath).listFiles();

        //null safety
        if (files == null) {
            System.out.println(filePath + " is empty");
            return;
        }

        Gson gsonDeserializer = new Gson();
        //deserialize each json file and put the created object in its map
        for (File file : files) {
            //make sure the Json file is parsed correctly
            try {
                Object object = gsonDeserializer.fromJson(String.valueOf(file), #OBJECTCLASS#);
                map.put(file.getName(), object);
                System.out.println(file.getName() + " is loaded");
            } catch (JsonParseException e){
                System.out.println(file.getName() + "is incorrectly parsed");
            }
        }
    }

例如:

public static void main(String[] args) throws Exception {
    HashMap<String, Class1> map1 = new HashMap<>();
    HashMap<String, Class2> map2 = new HashMap<>();

    Utils.loadObjsFromDirectory(map1, "directoryPath1");
    Utils.loadObjsFromDirectory(map2, "directoryPath2");
}

应将directoryPath1中的所有文件创建为Class1对象,并将directoryPath2中的所有文件创建为Class2对象。

jgwigjjp

jgwigjjp1#

您可以参数化并模拟Gson方法,并传入Class参数:

public static <ExpectedType>void loadObjsFromDirectory(Class<ExpectedType> expectedType, HashMap<String, ExpectedType> map, String directoryPath) {

//later
ExpectedType object = gsonDeserializer.fromJson(String.valueOf(file), expectedType);

ExpectedType是仅适用于方法声明的类型参数。它不是在代码中任何位置定义的类。
呼叫程式码(main方法)会变成:

public static void main(String[] args) throws Exception {
    HashMap<String, Class1> map1 = new HashMap<>();
    HashMap<String, Class2> map2 = new HashMap<>();

    Utils.loadObjsFromDirectory(Class1.class, map1, "directoryPath1");
    Utils.loadObjsFromDirectory(Class2.class, map2, "directoryPath2");
}

相关问题