使用Volley请求Unsplash API时遭遇JSONArray解析JSONException问题求助
解决Volley请求Unsplash API时的JSON解析异常
别慌,我一眼就看出问题所在啦!你遇到的JSONException完全是因为对接口返回的数据结构判断错了——Unsplash的搜索照片接口返回的不是直接的JSON数组,而是一个外层包裹的JSON对象,真正的图片数据数组藏在这个对象的results字段里。你误用了JsonArrayRequest来请求,自然会因为格式不匹配抛出异常。
问题根源
看你日志里的报错内容:Value {"total": 44760, "total_pages": 4476, "results":[{JSONObjects}]},这明显是一个JSON对象,而你用JsonArrayRequest去解析,Volley会默认把返回数据当成JSON数组来处理,直接就触发了格式异常。
修正方案
改用JsonObjectRequest来发起请求,拿到外层JSON对象后,再提取里面的results数组进行遍历处理就可以了。下面是修正后的完整代码:
// 替换成你自己的有效Access Key String URL = "https://api.unsplash.com/search/photos?query=wood&client_id=YOUR_ACTUAL_ACCESS_KEY"; JsonObjectRequest jsonObjectRequest = new JsonObjectRequest( Request.Method.GET, URL, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { if (response != null) { try { // 提取真正的图片数据数组 JSONArray resultsArray = response.getJSONArray("results"); // 遍历数组处理每个图片对象 for (int i = 0; i < resultsArray.length(); i++) { JSONObject photoObj = resultsArray.getJSONObject(i); Log.d("TESTING", photoObj.getString("id")); } // 关闭加载弹窗 p.dismiss(); } catch (JSONException e) { e.printStackTrace(); Log.d("TESTING", "JSON解析出错:" + e.getMessage()); } } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d("TESTING", "请求出错:" + (error.getMessage() != null ? error.getMessage() : "未知错误")); } } ); RequestQueue requestQueue = Volley.newRequestQueue(this); requestQueue.add(jsonObjectRequest);
关键注意点
- 一定要替换代码里的
YOUR_ACTUAL_ACCESS_KEY为你在Unsplash开发者平台申请到的有效Access Key,否则请求会被拒绝。 - 后续如果需要获取图片的其他信息(比如图片地址、摄影师信息),都要从
results数组里的每个JSONObject中提取,不要直接从外层对象拿。
内容的提问来源于stack exchange,提问作者BOT
相关产品推荐
相关产品推荐

