【发布时间】:2011-12-09 18:25:19
【问题描述】:
当我尝试将 json-smart JSONObject 或 JSONArray 作为可序列化数据作为 Intent 可序列化额外数据传递时,我的 Android 代码中有一个奇怪的问题。 Json-smart 是非常快速和精简的 JSON 解析器实现,我强烈推荐它。 JSONObject 扩展 HashMap<String, Object> 和 JSONArray 扩展 ArrayList<Object> 几乎没有开销。这些对象都不会覆盖Object#write 或Object#read
问题来了:
如果我在Fragment#onSaveInstanceState(String, JSONObject) 中使用这些对象,一切正常。如果我在纯 Java 示例项目中序列化/反序列化这些对象,它会再次按预期工作。但是,如果我使用 Intent#putExtra(String, JSONObject) 然后尝试通过执行来获取我的 JSONObject
JSONObject json = (JSONObject) intent.getSerializableExtra("JSON");
我会得到ClassCastException,因为该方法返回的是一个普通的HashMap(如果是JSONArray,它是ArrayList)。此外,如果我查看地图/数组内部,内容将完全去除对 JSONObject/JSONArray 的任何引用,并替换为 HashMaps/ArrayLists
我filed the ticket 并提供了示例项目,但不幸的是作者没有解决就关闭了它,所以我只是想深入了解它。如果你去买票,它附有简单的项目。
有办法解决吗?现在我必须将 JSONObject 或 JSONArray 转换为 String 并将其重新解析回对象,例如:
JSONArray feeds = (JSONArray) JSONValue.parse(intent.getStringExtra(RAW_FEED));
【问题讨论】:
-
仅供参考,
JSONObject json = new JSONObject(intent.getSerializableExtra("JSON"))应该可以正常工作。 -
@Jens 这不起作用(至少完全不起作用)。是的 - 您将获得外部 JSONObject,但所有内部结构都是普通的 HashMaps 和 ArrayLists。我刚刚通过修改和执行票证中包含的测试项目验证了这一点
-
是的。 JSON Object 可以由 HashMap 构造,实际上是一个 HashMap。
-
只是一个问题,JSONSmart 是否在同一版本中两边都可用?这是 [反] 序列化事故的最常见来源
-
问题清楚地概述了对象的 HashMap/ArrayList 性质。 “双方”是什么意思?库以 jar 形式提供。门票附有小测试项目,欢迎尝试任意组合。