我如何将Gson反序列化为特定实现的接口?

时间:2015-08-24 11:39:54

标签: 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

1 个答案:

答案 0 :(得分:1)

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

但是,这种情况太复杂了。只需在您的包装类中将其称为HashMap即可。 如果实施无关紧要,则只编程到接口,但如果确实重要 ,则编程实施,就像这里的情况一样。

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