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

Android Studio中org.json.JSONException求助:Volley调用OpenWeatherMap异常

排查Volley请求OpenWeatherMap时的org.json.JSONException问题

我太懂这种崩溃的感觉了——明明Postman里能拿到干干净净的JSON数据,自己用Volley写的代码一跑就报JSON解析异常,简直头大。不过别慌,咱们一步步拆解可能的问题,再对应找解决办法,大概率能快速搞定。

一、最常见的几个异常根源&解决思路

1. 你拿到的响应根本不是预期的JSON

有时候Volley返回的响应看起来像是JSON,其实是服务器扔回来的错误页面(比如API key无效、参数写错导致的403/404 HTML),或者带了多余的字符前缀,自然解析失败。

怎么验证&解决:
先在Volley的响应回调里把原始响应完整打出来,看看和Postman里的JSON是不是一回事:

@Override
public void onResponse(String response) {
    Log.d("VolleyRawResponse", "拿到的原始数据: " + response); // 打印全量响应
    // 原来的解析代码放后面
}

如果打印出来是HTML,先检查你的请求URL:API key有没有填对?城市名/经纬度参数是不是格式错了?请求的是weather还是forecast端点?这些细节很容易踩坑。

2. JSON解析的路径完全错了

这是最常见的原因——你以为要取的键在第一层,结果实际在嵌套的对象里;或者键名大小写写错了(OpenWeatherMap的键全是小写,比如main不是Main,temp不是Temp)。

怎么验证&解决:
把Postman拿到的JSON格式化后,对着你的解析代码逐层级核对。比如正确取温度的代码应该是这样的:

JSONObject rootObj = new JSONObject(response);
JSONObject mainObj = rootObj.getJSONObject("main"); // 先拿到main嵌套对象
double temp = mainObj.getDouble("temp"); // 再从main里取temp

另外,要是某些字段可能不存在(比如部分天气状态下没有某个数据),别用getXXX,改用optXXX方法,这样不会因为字段缺失直接抛异常:

JSONObject mainObj = rootObj.optJSONObject("main");
if (mainObj != null) {
    double temp = mainObj.optDouble("temp", 0.0); // 第二个参数是字段不存在时的默认值
}

3. Volley的请求类型用错了

比如你用了JsonObjectRequest,但服务器返回的是纯字符串;或者用了StringRequest却没处理好就直接转JSONObject,都会触发异常。

怎么验证&解决:

  • 如果用JsonObjectRequest,Volley会自动帮你把响应转成JSONObject,但前提是响应必须是合法JSON,否则直接报错。这种情况下可以先换成StringRequest,打印原始响应看看问题。
  • 检查请求的构造参数:请求方法(GET/POST)、URL、请求体(如果有的话)是不是都和Postman里的一致。

4. 字符编码搞砸了

这种情况比较少见,但也有可能——响应的字符编码不对,导致JSON字符串乱码,解析自然失败。

怎么解决:
在StringRequest的回调里手动转成UTF-8编码试试:

StringRequest stringRequest = new StringRequest(Request.Method.GET, yourUrl,
        response -> {
            try {
                // 转成UTF-8编码的字符串
                String correctJsonStr = new String(response.getBytes("ISO-8859-1"), "UTF-8");
                JSONObject jsonObj = new JSONObject(correctJsonStr);
                // 后续解析操作
            } catch (UnsupportedEncodingException | JSONException e) {
                e.printStackTrace();
            }
        },
        error -> error.printStackTrace()
);

二、需要你补充这些信息,帮你精准定位

如果上面的方法都没搞定,麻烦把这些内容贴出来:

  • 你的Volley请求+解析代码片段(重点是响应回调里的解析部分)
  • 完整的org.json.JSONException报错信息(比如报错行号、具体提示是No value for xxx还是End of input at character 0)
  • Postman拿到的OpenWeatherMap JSON示例(API key可以打码)

有了这些信息,就能直接定位到具体哪一行出问题啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:53:06