【发布时间】:2011-03-22 19:14:41
【问题描述】:
我有一个包含多种类型的地图,就像这个简单的例子一样
final Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("a", 1);
map.put("b", "a");
map.put("c", 2);
final Gson gson = new Gson();
final String string = gson.toJson(map);
final Type type = new TypeToken<LinkedHashMap<String, Object>>(){}.getType();
final Map<Object, Object> map2 = gson.fromJson(string, type);
for (final Entry<Object, Object> entry : map2.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
我得到的只是Objects,没有Integers,没有Strings。输出看起来像
a : java.lang.Object@48d19bc8
b : java.lang.Object@394a8cd1
c : java.lang.Object@4d630ab9
我能以某种方式修复它吗?我希望默认情况下会正确处理这种简单的情况。
我知道关于类型的信息不能总是保留,可能1 和"1" 在JSON 中的意思完全一样。但是,返回普通的无内容对象对我来说毫无意义。
更新:序列化版本(即上面的string)看起来不错:
{"a":1,"b":"a","c":2}
【问题讨论】:
-
您能看看
final String string的样子吗?我相信这将有助于理解问题。 -
我也遇到过这种情况...这就是我使用 JSONer 的原因...它可能会慢一些,但它比 Gson 更通用:nu-art-infrastructure.blogspot.co.il/2013/03/jsoner.html
-
@TacB0sS:我遵循了“清晰和静态数据结构”的建议。然而,让 Gson 处理这个问题应该是微不足道的。你愿意提出问题吗?
-
这件事的可怕之处在于,我将 GSON 与 Android 一起使用,并且在我的手机上运行良好,而在其他手机上它会创建您所描述的内容......我的解决方案也很明确静态的,但在 JSONer 解析器中,您可以使用带有嵌套复杂对象的地图和列表,这一切都在注解中解决了!
-
想提出关于什么的问题?他们不知道这个问题吗?