2016-04-26 156 views
0

,我有以下代码示例什么,我想实现:的Java GSON序列化和内部HashMap的反序列化对象(键,对象)

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中的正确实例?

+0

使用一个类型令牌。将副本应用于“Map”而不是“List”。 – Savior

+1

'Type type = new TypeToken (){}。getType();'缺少'>'。 – totoro

+0

谢谢。纠正了这个问题。 – Nom1fan

回答

2

Object被反序列化为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"; 
} 

希望它有帮助。

UPDATE

甲基类(X在这种情况下)可能是一个解决方案:

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"; 
    } 
} 
+0

你的回答是正确的,但我实际上试图实现一些更复杂的东西。我更新了问题主体来说明。我用Object来定义HashMap是有原因的。因为我需要包含不同的类型。谢谢! – Nom1fan

+0

看来我再次简化了我的案例:)虽然你的回答在我给出的情况下再次正确。 在我真实的情况下,类之间没有真正的相似性(可以只是字符串,枚举或任何其他类。) 但我开始认为没有优雅的解决方案。我现在正在做的只是使用valueOf作为变量,将其解释为原始的可视类型。但是对于复杂的课程,我没有解决方案,所以我只是将他们的领域分开并分别传给他们...... – Nom1fan