【问题标题】:Is it possible to have a single Gson-based method to deserialize maps with values from different classes?是否有可能有一个基于 Gson 的方法来反序列化具有来自不同类的值的映射?
【发布时间】:2015-01-27 19:25:24
【问题描述】:

我有两种几乎相同的方法,都读取序列化为 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();

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

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

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

【问题讨论】:

  • 我认为您发布的代码中可能有一些拼写错误,您可能应该验证它是否可以编译,以便我们可以尝试一下。
  • 想到 Java 泛型

标签: java json serialization gson guava


【解决方案1】:

如果您可以发布带有示例类和输入文件的 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    相关资源
    最近更新 更多