java - Gson 如何将接口(interface)反序列化为特定实现?

标签 java json gson deserialization

如果我尝试反序列化下面的 Wrapper 类,它旨在保存类 HashMap 的实例,反序列化器将替换 com.google.gson 的类。 internal.LinkedTreeMap,这是不需要的。

我如何确保字段的实际类型是我想要的,即 HashMap

这是一个 MCVE 来说明我在问什么:

public class HashMapTry {
    public static class Wrapper {
        public String title = "My Title";
        public Map<String, String> map = new HashMap<String,String>();
    }

    public static void main(String[] args) {
        Wrapper wrapper = new Wrapper();
        Wrapper wrapper2;

        wrapper.map.put("vertical", "1, 0");
        wrapper.map.put("horizontal", "0, 1");

        GsonBuilder gb = new GsonBuilder()
                .enableComplexMapKeySerialization()
                .serializeNulls()
                .setPrettyPrinting()
                .setVersion(1.0)
                .setDateFormat("yyyy.MM.dd HH:mm:ss");

        Gson g = gb.create();

        String json = g.toJson(wrapper);
        System.out.println(json);

        wrapper2 = g.fromJson(json, Wrapper.class);
        System.out.println(wrapper2.map.getClass());
    }
}

输出:

{
  "title": "My Title",
  "map": {
    "horizontal": "0, 1",
    "vertical": "1, 0"
  }
}
class com.google.gson.internal.LinkedTreeMap

最佳答案

只需在 Wrapper 类中将其声明为 HashMap 即可。 Gson 不喜欢默认 反序列化到接口(interface),因为它必须弄清楚要反序列化到哪个类。如果它是一些随机接口(interface)(例如 interface MyInterface),它实际上会导致问题,因为该接口(interface)没有默认行为,您必须指定它,您可以通过注册 TypeAdapter 来实现.

但是,对于这种情况来说,这太复杂了。只需在包装类中将其称为 HashMap 即可。 只有在实现无关紧要时才针对接口(interface)进行编程,但如果它确实重要则针对实现进行编程,这里的情况很明显。

public static class Wrapper {
  public String title = "My Title";

  public HashMap<String, String> map = new HashMap<String, String>();
}

输出:

{
  "title": "My Title",
  "map": {
    "horizontal": "0, 1",
    "vertical": "1, 0"
  }
}
class java.util.HashMap

关于java - Gson 如何将接口(interface)反序列化为特定实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32181417/

相关文章:

Java:将文件名和字符串传递到命令行

java - Informix JDBC、MONEY 和字符串文字中的小数点分隔符的问题

javascript - 如何过滤Bitfinex API ws2流数据?

java - 使用 GSON 将 JSON 字符串转为 Java 对象

java - Gson:如何跳过特定字段

java - Antlr4 当第二个谓词失败时不遵循备用路径

java - RecyclerView 的项目在屏幕上的位置在运行时发生变化

java - 如何在 Java 中使用套接字发送 JSON 响应

python - 无法解析响应,不是有效的 JSON

javascript - 美化 JavaScript 中的字符串化对象以在静态 html 页面中提供服务