【发布时间】:2011-03-27 14:27:45
【问题描述】:
我想使用泛型对哈希图进行 gson 和 de-gson。
当我的密钥是字符串时我可以成功,但如果它是
对象。
我这里有两个代码部分。第一个不起作用,第二个
做。
// doesnt work works
try {
TradableBean tradable = new TradableBean("Tradable");
PositionBean position = new PositionBean(tradable);
Map<TradableBean, PositionBean> map1 = new HashMap<TradableBean, PositionBean>();
map1.put(tradable, position);
String json1 = gson.toJson(map1);
Map<TradableBean, PositionBean> map2 = gson.fromJson(json1, new TypeToken<Map<TradableBean, PositionBean>>(){}.getType());
System.out.println(map2);
} catch (Exception e) {
System.out.println("failed");
}
现在是工作部分 -
// works - with string
try {
String tradable = new String("Tradable");
PositionBean position = new PositionBean(new TradableBean("Tradable"));
Map<String, PositionBean> map1 = new HashMap<String,PositionBean>();
map1.put(tradable, position);
String json1 = gson.toJson(map1);
Map<String, PositionBean> map2 = gson.fromJson(json1, new TypeToken<Map<String, PositionBean>>() {}.getType());
System.out.println(map2);
} catch (Exception e) {
System.out.println("failed");
}
在我的 TradableBean 中:
@Override public int hashCode() {
return getId();}
@Override public boolean equals(Object obj) {
boolean equals = false;
if (obj instanceof AccountBean){
TradableBean tradable_p = (TradableBean)obj;
if (getId()==tradable_p.getId()){
equals = true;
}
}
return equals;
}
例外:
com.google.gson.JsonParseException: Expecting object found: "TradableBean{id=0, tradableName='Tradable', moneyMultiplier=1, expirationDate=null}" at com.google.gson.JsonObjectDeserializationVisitor.visitFieldUsingCustomHandler(JsonObjectDeserializationVisitor.java: 100) at com.google.gson.ObjectNavigator.navigateClassFields(ObjectNavigator.java: 150) at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:123) at com.google.gson.JsonDeserializationContextDefault.fromJsonPrimitive(JsonDeserializationContextDefault.java: 84) at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java: 53) at com.google.gson.DefaultTypeAdapters $MapTypeAdapter.deserialize(DefaultTypeAdapters.java:531) at com.google.gson.DefaultTypeAdapters $MapTypeAdapter.deserialize(DefaultTypeAdapters.java:498) at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDeserializerExceptionWrapper.java: 50)
【问题讨论】: