当前位置: 首页 > 知识库问答 >
问题:

Java Gson序列化和反序列化HashMap(键,对象)中的对象[duplicate]

丌官盛
2023-03-14
public static void main(String args[]) {

    Map<String, Object> map = new HashMap<String, Object>();
    map.put("1", new A());  
    map.put("2", new B());
    String json = new Gson().toJson(map);
    Type type = new TypeToken<Map<String, Object>>(){}.getType();
    map = new Gson().fromJson(json, type);
    A a = (A) map.get("1"); 
    B b = (B) map.get("2");

}

static class A {

    int inum = 1;
    double dnum = 1.0;
    String str = "1";

}

static class B {

    int inum = 2;
    double dnum = 2.0;
    String str = "2";

}

以下代码导致此异常:

Exception in thread "main" java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to ParseJson$A
    at ParseJson.main(ParseJson.java:19)

所以问题是:如何在GSON序列化和反序列化的泛型HashMap中获得正确的实例?

共有1个答案

澹台玉石
2023-03-14

对象反序列化为com.google.gson.internal.LinkedTreeMap,因此告诉GSON您需要A类。

public static void main(String args[]) {
    Map<String, Object> map = new HashMap<>();
    map.put("1", new A());
    String json = new Gson().toJson(map);
    Type type = new TypeToken<Map<String, A>>() {
    }.getType();
    map = new Gson().fromJson(json, type);
    A a = (A) map.get("1");
    System.out.println(a.str);
}

static class A {
    private int num1 = 1;
    private double num2 = 2.0;
    private String str = "String";
}

希望有帮助。

更新

public static void main(String args[]) {
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("1", new A());
    map.put("2", new B());
    String json = new Gson().toJson(map);
    Type type = new TypeToken<Map<String, X>>(){}.getType();
    map = new Gson().fromJson(json, type);
    X a = (X) map.get("1");
    X b = (X) map.get("2");
    System.out.println(a.str);
    System.out.println(b.str);
}

static class X {
    int inum;
    double dnum;
    String str;

    X() {
    }
}

static class A extends X {
    A() {
        inum = 1;
        dnum = 1.0;
        str = "1";
    }
}

static class B extends X {
    B() {
        inum = 2;
        dnum = 2.0;
        str = "2";
    }
}
 类似资料:
  • 本文向大家介绍java对象的序列化和反序列化,包括了java对象的序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java对象的序列化和反序列化,供大家参考,具体内容如下 1. 什么是序列化        将对象转换为字节流保存起来,比如保存到文件里,并在以后还原这个对象,这种机制叫做对象序列化。(补充一句:把对象保存到永久存储设备上称为持久化) 2. 怎么实现序列化

  • 我已经开始将一个项目从使用Java标准日期迁移到Joda DateTime。 我的项目使用XML序列化将对象保存到XML文件中。在这个特殊的例子中,我有一个Item类,它有一个DateTime属性。 在某个时候,我正在初始化对象,包括像这样的DateTime属性: 我使用XMLEncoder使用辅助类序列化项目: 显然,日期时间被保存在xml中。。。但毫无价值: 显然,它没有保存任何东西,但不,它

  • 本文向大家介绍详解Java 对象序列化和反序列化,包括了详解Java 对象序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个输出到流中,读出时相反。在我们看来这种行为实在是繁琐,尤其是在这个对象中属性值很多的时候。基于此,Java中对象的序列

  • 我遇到了这个问题,无法使用JDBC使用quartz JobDataMap反序列化对象。使用RAMJobStore的代码也可以正常工作。 我只是创建了一个测试的基本类 然后是石英 在石英行业 我得到的例外是这个 JAVAlang.ClassCastException:com。文克洛瓦斯。石英建筑。无法将测试转换为com。文克洛瓦斯。石英建筑。在com上测试。文克洛瓦斯。石英建筑。建筑升级工作。在or

  • 错误: java.lang.ClassNotFoundException:testprocedure.tp$3在java.net.URLClassLoader$1上运行(未知源)在java.net.URLClassLoader上运行(未知源)在java.security.accessController.doprivileged(本机方法)在java.net.URLClassLoader.find