是否可以使用一个基于 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(FirstClass
和 SecondClass
)没有任何关联。
在这种情况下是否可以使用单一的反序列化方法?如果是,我应该如何进行?
如果您可以 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;
}
我有两种几乎相同的方法,都读取序列化为 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(FirstClass
和 SecondClass
)没有任何关联。
在这种情况下是否可以使用单一的反序列化方法?如果是,我应该如何进行?
如果您可以 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;
}