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

如何在Android中从Django REST API获取无JSON数组名称的JSON数据?

解决Android解析Django REST API返回的无名称JSON数组问题

我清楚你遇到的问题了——你的Django REST API返回的是没有外层键名的纯JSON数组(格式类似[{"id":1, "title":"商品1"}, {"id":2, "title":"商品2"}]),但你当前用JsonObjectRequest去解析,还试图通过空字符串获取JSONArray,这必然会触发解析错误,因为API返回的根节点是数组而非对象。

核心解决方案:改用JsonArrayRequest

Volley库中,JsonObjectRequest用于解析根节点为JSON对象(外层是{})的响应,而JsonArrayRequest专门处理根节点为JSON数组(外层是[])的响应,正好匹配你的API返回格式。

修改后的完整代码示例

private void jsonParse() { 
    // 注意:Android模拟器访问本地主机的Django服务,要使用10.0.2.2而非127.0.0.1
    String url = "http://10.0.2.2:8000/products/products/"; 
    
    // 替换为JsonArrayRequest,直接接收JSONArray类型的响应
    JsonArrayRequest request = new JsonArrayRequest(Request.Method.GET, url, null, 
        new Response.Listener<JSONArray>() { 
            @Override 
            public void onResponse(JSONArray response) { 
                try { 
                    // 直接遍历返回的JSONArray,无需再通过键名获取子数组
                    for (int i = 0; i < response.length(); i++) { 
                        JSONObject productObj = response.getJSONObject(i); 
                        
                        // 解析单个商品的字段
                        int id = productObj.getInt("id"); 
                        String title = productObj.getString("title"); 
                        String description = productObj.getString("description");
                        
                        // 这里可以添加自定义逻辑,比如把数据存入列表、更新UI等
                        Log.d("ProductData", "ID: " + id + " | 标题: " + title);
                    } 
                } catch (JSONException e) { 
                    // 捕获JSON解析异常,方便排查问题
                    Log.e("JsonParseError", "解析失败: " + e.getMessage());
                    e.printStackTrace(); 
                } 
            } 
        }, 
        new Response.ErrorListener() { 
            @Override 
            public void onErrorResponse(VolleyError error) { 
                // 处理请求失败的情况,比如网络错误、API不可达等
                Log.e("RequestError", "请求失败: " + error.getMessage());
                error.printStackTrace(); 
            } 
        }); 
    
    // 将请求加入Volley请求队列执行
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(request);
}

额外注意事项

  • 模拟器访问本地服务:如果你的Django服务运行在本地电脑,Android模拟器不能用127.0.0.1,必须替换为10.0.2.2(这是Android模拟器映射主机localhost的专用地址)。
  • 网络权限:确保在AndroidManifest.xml中添加网络权限:
    <uses-permission android:name="android.permission.INTERNET"/>
    
  • CORS设置:如果Django服务和Android应用不在同一域下(比如本地测试场景),需要在Django中配置CORS允许跨域请求,比如使用django-cors-headers库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:11:10