Android应用Map与JSONObject转换报错:JSONObject无法转为java.util.Map
解决Android中JSONObject转Map的崩溃问题
问题根源
你遇到的org.json.JSONObject cannot be cast to java.util.Map崩溃,核心原因很明确:item.get("product")返回的是**org.json.JSONObject实例**,而不是java.util.Map。这两个类没有继承或实现关系,直接强制类型转换必然触发ClassCastException——就像你不能把苹果强制当成橘子一样。
两种可行的解决方案
方案一:手动遍历JSONObject转换为Map
如果不想引入第三方库,可以手动遍历JSONObject的键值对,把内容转存到Map里,还能处理嵌套的JSONObject:
// 第一步:先正确获取JSONObject,避免强转 JSONObject productJson = item.getJSONObject("product"); // 第二步:转换为Map Map<String, Object> productMap = new HashMap<>(); Iterator<String> keys = productJson.keys(); while (keys.hasNext()) { String key = keys.next(); try { Object value = productJson.get(key); // 递归处理嵌套的JSONObject if (value instanceof JSONObject) { value = convertJsonToMap((JSONObject) value); } productMap.put(key, value); } catch (JSONException e) { e.printStackTrace(); } } // 递归转换方法 private Map<String, Object> convertJsonToMap(JSONObject json) throws JSONException { Map<String, Object> map = new HashMap<>(); Iterator<String> keys = json.keys(); while (keys.hasNext()) { String key = keys.next(); Object value = json.get(key); if (value instanceof JSONObject) { value = convertJsonToMap((JSONObject) value); } map.put(key, value); } return map; }
方案二:用Gson库自动转换(推荐)
如果项目允许引入第三方库,用Gson这类序列化工具会更简洁高效,还能自动处理嵌套结构:
- 先在你的
build.gradle(Module级别)添加Gson依赖:
implementation 'com.google.code.gson:gson:2.10.1'
- 然后用Gson完成转换:
// 获取JSONObject JSONObject productJson = item.getJSONObject("product"); // 初始化Gson Gson gson = new Gson(); // 转换为Map Map<String, Object> productMap = gson.fromJson( productJson.toString(), new TypeToken<Map<String, Object>>(){}.getType() );
如果是直接从OpenFoodFacts接口拿到的JSON字符串,还能一步到位把整个响应转成Map:
String apiResponse = ...; // 接口返回的JSON字符串 Map<String, Object> responseMap = gson.fromJson( apiResponse, new TypeToken<Map<String, Object>>(){}.getType() ); // 直接获取product对应的Map Map<String, Object> productMap = (Map<String, Object>) responseMap.get("product");
为什么之前的尝试失败?
你提到"直接获取JSONObject再转Map提示类型不兼容",是因为JSONObject本身不是Map的实现类,即使内部用Map存储数据,Java也不允许跨类型的强制转换。必须通过上述方法把JSONObject的内容复制到Map中,而不是直接强转。
内容的提问来源于stack exchange,提问作者George Hanlon
相关产品推荐
相关产品推荐

