java - 是否有可能有一个基于 Gson 的方法来反序列化具有不同类的值的映射?

标签 java json serialization gson guava

我有两种几乎相同的方法,都读取序列化为 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 时,我感到非常困惑。

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

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

最佳答案

如果您可以发布包含示例类和输入文件的 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/

相关文章:

c# - (用 Jill 反序列化动态对象?

java - Java GUI 项目中的 View 、触发器和存储过程有什么用处吗?

java - 如何从 Jena RDF Inf 模型中的节点值获取个人名称

java - 当 javafx 中的阶段启动时,如何在不点击按钮的情况下自动创建运行方法?

json - Dart编程查询:读取GET的响应

php - 将解析后的json数据插入到MySQL表中

java - DTD 中不允许向 xml 元素添加属性

json - 类似字典的 JSON 模式

c# - DynamoDB ExclusiveStartKey 的字典序列化不起作用

c++ - 将任何数据类型序列化为 vector<uint8_t> - 使用 reinterpret_cast?