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
相关产品推荐
相关产品推荐

