使用Volley的StringRequest解析Response时抛出JSONException如何解决?
解决Volley中StringRequest转JSONObject抛出JSONException的问题
我之前也碰到过一模一样的情况——日志里看着是标准的JSON字符串,但转JSONObject就是报错,大概率是响应字符串里藏着你看不到的多余字符,或者可以换个更省心的方式来处理。
快速修复:清理响应字符串再解析
你日志输出的{"error":false}看起来没问题,但实际的response可能带有不可见的BOM标记(UTF-8字节顺序标记),或者前后有空格、换行符,这些都会让JSONObject解析失败。试试先清理字符串再解析:
@Override public void onResponse(String response) { Log.v(TAG, "Response: " + response);//output {"error":false} try { // 先移除字符串两端的空白字符 String cleanedResponse = response.trim(); // 检查并移除开头的BOM标记(如果存在) if (cleanedResponse.startsWith("\uFEFF")) { cleanedResponse = cleanedResponse.substring(1); } JSONObject jo = new JSONObject(cleanedResponse); // 正常处理JSON内容 boolean isError = jo.getBoolean("error"); Log.d(TAG, "Error status: " + isError); } catch (JSONException e) { e.printStackTrace(); // 排查阶段可以打印响应字节数组,确认是否有异常字符 Log.e(TAG, "Raw response bytes: " + Arrays.toString(response.getBytes())); } }
更省心的方案:直接使用JsonObjectRequest
其实Volley已经提供了专门处理JSON响应的JsonObjectRequest,它会自动帮你把服务器返回的内容解析成JSONObject,完全不用手动处理字符串转换,代码也更简洁:
JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.POST, REGISTER_URL, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.v(TAG, "Response: " + response.toString()); try { boolean isError = response.getBoolean("error"); if (!isError) { // 解析其他字段 String uid = response.getString("uid"); JSONObject user = response.getJSONObject("user"); String userName = user.getString("name"); String createdAt = user.getString("created_at"); Log.d(TAG, "User: " + userName + ", Created at: " + createdAt); } } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 处理请求错误 Log.e(TAG, "Request error: " + error.getMessage()); } });
这个方案能避开很多手动转换带来的坑,我自己做Volley请求时,只要是JSON响应都会优先用JsonObjectRequest。
内容的提问来源于stack exchange,提问作者Amir Dianati
相关产品推荐
相关产品推荐

