我有两种几乎相同的方法,都读取序列化为 JSON 的 map 。这些是每个键有多个值的映射,因此我将这些映射转换为 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();
我希望为我拥有的每个自定义类使用单一方法而不是新方法。但在这里,当我尝试使用反射来识别值是 FirstClass
还是 SecondClass
时,我感到非常困惑。
自定义类(FirstClass
和 SecondClass
)没有任何关联。
在这种情况下是否可以使用单一的反序列化方法?如果是,我应该如何进行?
最佳答案
如果您可以发布包含示例类和输入文件的 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;
}
关于java - 是否有可能有一个基于 Gson 的方法来反序列化具有不同类的值的映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28178412/