You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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这类序列化工具会更简洁高效,还能自动处理嵌套结构:

  1. 先在你的build.gradle(Module级别)添加Gson依赖:
implementation 'com.google.code.gson:gson:2.10.1'
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:50:33