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

Android使用simplejson解析JSON报错:String无法转为JSONObject

解决simplejson解析InputStream字符串时的类型转换异常

问题根源

你遇到的java.lang.String cannot be cast to org.json.simple.JSONObject异常,本质是从InputStream读取的JSON字符串格式不合法——大概率是字符串带了外层包裹的双引号(比如你提供的示例字符串是"{"Result":...}"),或者内部转义字符未正确处理,导致JSONParser解析后返回的是String类型而非JSONObject,强转自然失败。而直接赋值变量时你可能已经手动修正了这些格式问题,所以能正常解析。

修复步骤(Android按钮触发场景)

1. 正确读取并清洗InputStream中的JSON字符串

读取时要去掉多余的空白、外层双引号,并修正转义字符:

button.setOnClickListener(v -> {
    // 网络/IO操作必须在子线程执行(Android强制要求)
    new Thread(() -> {
        try (InputStream inputStream = /* 你的输入流来源 */;
             BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
            
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line.trim()); // 移除每行的换行、空格
            }
            String rawJson = sb.toString();
            
            // 清洗字符串:去掉外层双引号,修正内部转义的双引号
            String cleanJson = rawJson;
            if (cleanJson.startsWith("\"") && cleanJson.endsWith("\"")) {
                cleanJson = cleanJson.substring(1, cleanJson.length() - 1);
                cleanJson = cleanJson.replace("\\\"", "\"");
            }
            
            // 2. 正常解析JSON
            JSONParser parser = new JSONParser();
            JSONObject rootObj = (JSONObject) parser.parse(cleanJson);
            
            // 解析Result数组
            JSONArray resultArr = (JSONArray) rootObj.get("Result");
            JSONObject result = (JSONObject) resultArr.get(0);
            String trxCode = (String) result.get("trxCode");
            String trxMsg = (String) result.get("trxMsg");
            
            // 解析Table1数组
            JSONArray tableArr = (JSONArray) rootObj.get("Table1");
            JSONObject tableItem = (JSONObject) tableArr.get(0);
            String tnsNm = (String) tableItem.get("TNS_NM");
            
            // 回到主线程更新UI
            runOnUiThread(() -> {
                // 示例:显示解析结果
                // textView.setText("交易状态:" + trxCode);
            });
            
        } catch (IOException | ParseException e) {
            e.printStackTrace();
            runOnUiThread(() -> {
                // 显示错误提示
                // Toast.makeText(getApplicationContext(), "解析失败", Toast.LENGTH_SHORT).show();
            });
        }
    }).start();
});

2. 核心注意事项

  • Android中所有网络/IO操作必须放在子线程,否则会触发NetworkOnMainThreadException,这里用了基础的Thread实现,也可以用Coroutine、AsyncTask等。
  • 解析完成后必须通过runOnUiThread回到主线程更新UI,Android不允许子线程操作UI。
  • 可以将清洗后的cleanJson复制到JSON校验工具验证格式是否正确,确保没有语法错误。

内容的提问来源于stack exchange,提问作者js u

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:35:23