使用Volley调用REST API时String转JSONObject遇JSONException求助
问题分析
异常根源很清楚:你拿到的接口响应不是直接的JSON对象,而是被双引号包裹、内部引号做了转义处理的字符串形式JSON。从你贴的返回响应就能看出来:
"{\"Emp_name\":\"Abc1\",\"DOJ\":\"01-01-2021\",\"DOB\":\"10-01-1997\",\"Manager_name\":\"abc\",\"designation\":\"TL\"}"
这种格式本质是一个"包含JSON内容的字符串",直接用new JSONObject(response)解析自然会报错,因为它不符合JSON对象的语法规范。
解决方案
这里提供两种直接可行的修复方式:
方式一:手动清理响应字符串
在解析前先去掉首尾的双引号,同时替换掉内部的转义反斜杠:
@Override public void onResponse(String response) { Toast.makeText(getApplicationContext(), "Response :" + response, Toast.LENGTH_LONG).show(); try { // 清理响应:去掉首尾引号,替换转义字符 String cleanedResponse = response.trim().substring(1, response.length() - 1).replace("\\\"", "\""); JSONObject jsonObject = new JSONObject(cleanedResponse); String empNAme = jsonObject.getString("Emp_name"); String doj = jsonObject.getString("DOJ"); String dob = jsonObject.getString("DOB"); String Manager_name = jsonObject.getString("Manager_name"); String designation = jsonObject.getString("designation"); // 后续业务逻辑 } catch (JSONException e) { e.printStackTrace(); } }
方式二:两次JSON解析
先把整个响应解析成JSON字符串类型,再基于这个字符串解析出目标JSONObject:
@Override public void onResponse(String response) { Toast.makeText(getApplicationContext(), "Response :" + response, Toast.LENGTH_LONG).show(); try { // 第一次解析:提取出内部的JSON字符串 JSONPrimitive jsonPrimitive = new JSONPrimitive(response); String jsonString = jsonPrimitive.getAsString(); // 第二次解析:转成可用的JSONObject JSONObject jsonObject = new JSONObject(jsonString); String empNAme = jsonObject.getString("Emp_name"); String doj = jsonObject.getString("DOJ"); String dob = jsonObject.getString("DOB"); String Manager_name = jsonObject.getString("Manager_name"); String designation = jsonObject.getString("designation"); // 后续业务逻辑 } catch (JSONException e) { e.printStackTrace(); } }
额外建议
如果后端可以调整,建议直接返回标准的JSON对象格式,不要把JSON内容包装成字符串返回,这样前端解析会更规范,从根源避免这类问题。
内容的提问来源于stack exchange,提问作者pradeep72767
相关产品推荐
相关产品推荐

