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

Android Volley解析JSON报java.lang.String无法转JSONObject错误如何解决

问题修复方案

问题根因

  • 服务端返回的响应不是合法JSON格式:当前返回内容是3个独立JSONObject直接拼接,没有用[]包裹为JSON数组,也没有用逗号分隔对象,导致Volley的JsonObjectRequest无法正确解析为JSONObject对象,触发类型转换报错。
  • 解析逻辑存在错误:即使返回合法JSON,banner_name本身是字符串类型,你使用getJSONObject()方法取值也会触发类型错误;同时你把requestQueue.add()写在了请求回调内部,请求根本不会被触发执行。

修复步骤

  • 优先协调服务端修改返回格式,输出合法的JSON数组,标准格式如下:
[
    {
        "id": 12,
        "banner_name": "testproject1.indigierp.com/images/banners/promo1.jpg"
    },
    {
        "id": 14,
        "banner_name": "testproject1.indigierp.com/images/banners/promo3.jpg"
    },
    {
        "id": 15,
        "banner_name": "testproject1.indigierp.com/images/banners/promo4.jpg"
    }
]
  • 服务端格式修正后,Android端调整请求类型和解析逻辑,修改后的代码如下:
final RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
String BANNER_URL = "http://testproject1.indigierp.com/api/banner_details";

// 改用JsonArrayRequest接收数组类型响应
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.POST, BANNER_URL, null, response -> {
    try {
        // 遍历JSON数组获取每个对象
        for (int i = 0; i < response.length(); i++) {
            JSONObject item = response.getJSONObject(i);
            // banner_name是字符串类型,直接用getString取值
            String bannerUrl = item.getString("banner_name");
            int id = item.getInt("id");
            Log.e("Image", "id: " + id + "  banner地址: " + bannerUrl);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}, error -> {
    // 补充请求失败的异常处理
    Log.e("请求错误", error.toString());
});

// add方法移到请求外部,触发请求执行
requestQueue.add(jsonArrayRequest);
  • 如果无法协调服务端修改格式,可以在客户端手动兼容处理,用StringRequest获取原始响应文本后拼接为合法JSON再解析,示例代码如下:
StringRequest stringRequest = new StringRequest(Request.Method.POST, BANNER_URL, response -> {
    try {
        // 把非法拼接的JSON字符串处理为合法数组格式
        String validJson = "[" + response.replace("}{", "},{") + "]";
        JSONArray jsonArray = new JSONArray(validJson);
        // 后续遍历解析逻辑和上面一致
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject item = jsonArray.getJSONObject(i);
            String bannerUrl = item.getString("banner_name");
            Log.e("Image", bannerUrl);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}, error -> Log.e("请求错误", error.toString()));

requestQueue.add(stringRequest);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:24:00