是否可以使用一个基于 Gson 的方法来反序列化具有来自不同 类 的值的地图?

Is it possible to have a single Gson-based method to deserialize maps with values from different classes?

我有两种几乎相同的方法,都读取序列化为 JSON 的地图。这些是每个键具有多个值的映射,因此我将映射转换为 guava Multimap。我正在使用 Gson 对这些地图进行序列化和反序列化。相关部分代码如下:

Gson gson = new GsonBuilder().enableComplexMapKeySerialization()
                             .setPrettyPrinting()
                             .create();

现在,几乎相同的反序列化方法是:

private static Multimap<String, FirstClass> readFirstClassMMap(Path jsonFile, Type mapType) throws IOException {
    Map<String, Set<FirstClass>> map = GSON.fromJson(Files.newBufferedReader(jsonFile), mapType);
    Multimap<String, FirstClass> mmap = HashMultimap.create();
    for (String key : map.keySet())
        mmap.putAll(key, map.get(key));

    return mmap;
}

private static Multimap<String, SecondClass> readSecondClassMMap(Path jsonFile, Type mapType) throws IOException {
    Map<String, Set<SecondClass>> map = GSON.fromJson(Files.newBufferedReader(jsonFile), mapType);
    Multimap<String, FirstClass> mmap = HashMultimap.create();
    for (String key : map.keySet())
        mmap.putAll(key, map.get(key));

    return mmap;
}

第二个参数 mapType 是在调用这些方法之前创建的,如下所示:

Type maptype = new TypeToken<Map<String, Set<FirstClass>>>() {}.getType();

我想为我拥有的每个自定义 class 使用单一方法而不是新方法。但是在这里,当我尝试使用反射来确定值是 FirstClass 还是 SecondClass.

时,我真的很困惑

自定义 classes(FirstClassSecondClass)没有任何关联。

在这种情况下是否可以使用单一的反序列化方法?如果是,我应该如何进行?

如果您可以 post 一个带有示例 类 和输入文件的 SSCCE,那将非常有帮助。像这样的东西可能会起作用,但是在不了解更多关于它预期处理的输入类型的情况下,我不确定它是否会起作用。

private static final Gson GSON = new GsonBuilder().enableComplexMapKeySerialization()
                                                  .setPrettyPrinting()
                                                  .create();

private static <T> Multimap<String, T> readAnyClassMMap(Path jsonFile, Type typeOfT) throws IOException {
    Map<String, Set<T>> map = GSON.fromJson(Files.newBufferedReader(jsonFile, Charset.defaultCharset()), typeOfT);
    Multimap<String, T> mmap = HashMultimap.create();
    for (String key : map.keySet()) {
        mmap.putAll(key, map.get(key));
    }
    return mmap;
}