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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:48:50