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

如何解决Android中org.json.JSONException:String无法转为JSONObject?

问题排查与解决方案

1. 先定位JSONException的根源

这个异常90%的概率是服务器返回的不是合法JSON格式内容,比如服务器报错返回了HTML错误页、纯文本提示,而非你预期的JSON。先通过StringRequest打印服务器的原始响应内容:

StringRequest stringRequest = new StringRequest(Request.Method.POST, YOUR_SERVER_URL,
        response -> {
            // 打印服务器返回的原始内容,不管成功失败
            Log.d("ServerRawResp", "Response: " + response);
        },
        error -> {
            // 打印错误响应的原始内容(如果有)
            if (error.networkResponse != null) {
                String errorBody = new String(error.networkResponse.data);
                Log.d("ServerErrorResp", "Error: " + errorBody);
            }
        }) {
    @Override
    protected Map<String, String> getParams() {
        // 这里放你原来的参数Map
        Map<String, String> params = new HashMap<>();
        params.put("order_id", "12345");
        params.put("amount", "99");
        return params;
    }
};
// 记得把请求加到RequestQueue
Volley.newRequestQueue(context).add(stringRequest);

查看日志里的输出:如果是HTML代码、"Required data not given"这类纯文本,那就是服务器没返回JSON,导致JsonObjectRequest解析失败。

2. 解决"Required data not given"问题

这个提示说明服务器没接收到预期参数,分两种情况排查:

情况A:服务器用表单格式接收(PHP用$_POST获取)

  • 确认请求方法是POST,且参数键名和PHP端完全一致(比如PHP要user_id,你不能传userId)
  • 检查参数值是否为空或格式不符合要求(比如服务器要求数字类型,你传了字符串但PHP没做转换)
  • 不要手动拼接参数字符串,用getParams()方法返回Map,Volley会自动处理表单编码

情况B:服务器要求JSON格式请求体(PHP用file_get_contents('php://input')获取)

这种情况不能用getParams(),要直接传JSONObject作为请求体:

// 构造请求用的JSONObject
JSONObject requestJson = new JSONObject();
try {
    requestJson.put("order_id", "12345");
    requestJson.put("amount", 99);
} catch (JSONException e) {
    e.printStackTrace();
}

JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.POST, YOUR_SERVER_URL, requestJson,
        response -> {
            // 处理合法的JSON响应
            Log.d("JsonResp", response.toString());
        },
        error -> {
            // 处理错误
        }) {
    @Override
    public String getBodyContentType() {
        // 必须设置请求头为JSON格式
        return "application/json; charset=utf-8";
    }
};
Volley.newRequestQueue(context).add(jsonRequest);

对应的PHP端要这样读取:

$rawData = file_get_contents('php://input');
$data = json_decode($rawData, true);
// 检查参数是否存在
if (!isset($data['order_id']) || !isset($data['amount'])) {
    echo json_encode(['msg' => 'Required data not given']);
    exit;
}

3. 关于Map转JSONObject的注意事项

如果之前转JSONObject出错,检查Map中的值是否包含JSON不支持的类型(比如Date对象、自定义类),必须转成字符串/数字/布尔值等基础类型:

Map<String, Object> paramMap = new HashMap<>();
// 错误示例:直接放Date对象
// paramMap.put("create_time", new Date());
// 正确做法:转成字符串
paramMap.put("create_time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
JSONObject json = new JSONObject(paramMap);

4. PHP端额外检查

  • 确保PHP没有输出多余内容(比如调试用的echo、空格、HTML注释),否则会破坏JSON格式
  • 输出JSON时必须设置正确的响应头:
header('Content-Type: application/json');
echo json_encode(['status' => 'success', 'data' => $result]);
exit; // 终止后续输出,避免多余内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:05:01