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

Android Studio多参数调用API及嵌套JSON数组解析求助

解决你的Android API调用与嵌套JSON解析问题

1. 调用带有多个参数的API(基于你使用的Volley库)

在Android Studio里用Volley处理带多参数的API请求,分两种场景来实现更清晰:

GET请求:参数直接拼接URL

如果是GET请求,最简单的方式就是把参数以?key1=value1&key2=value2的格式拼在基础URL末尾,比如:

String baseUrl = "https://example.com/api/articles";
// 假设需要传分类和页码两个参数
String url = baseUrl + "?category=technology&page=2";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, ...);

GET请求:用Uri.Builder优雅管理参数

参数较多时,用Uri.Builder来拼接更不容易出错:

String baseUrl = "https://example.com/api/articles";
Uri.Builder uriBuilder = Uri.parse(baseUrl).buildUpon();
uriBuilder.appendQueryParameter("category", "technology");
uriBuilder.appendQueryParameter("page", "2");
// 可以继续追加更多参数
String finalUrl = uriBuilder.build().toString();
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, finalUrl, null, ...);

POST请求:参数放在请求体里

如果是POST请求,把参数封装成JSONObject传入JsonObjectRequest的第三个参数即可:

String url = "https://example.com/api/articles";
JSONObject params = new JSONObject();
try {
    params.put("category", "technology");
    params.put("page", "2");
} catch (JSONException e) {
    e.printStackTrace();
}
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, params, ...);

2. 解析包含嵌套JSON数组的API数据

先假设你的API返回的JSON结构大致是这样(对应你提到的body->paragraph->line嵌套逻辑):

{
  "items": [
    {
      "article_author": "测试作者",
      "src": "https://example.com/image.jpg",
      "first_published_at": "2024-05-20",
      "title": "测试标题",
      "body": {
        "paragraph": [
          {
            "line": ["第一段第一行", "第一段第二行"]
          },
          {
            "line": ["第二段第一行"]
          }
        ]
      }
    }
  ]
}

你需要逐层拆解嵌套的JSON结构,修改后的parseJSON方法如下:

private void parseJSON() { 
    String url = "https://blah.com"; // 替换为实际带参数的URL
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, 
        new Response.Listener<JSONObject>() { 
            @Override 
            public void onResponse(JSONObject response) { 
                try { 
                    JSONArray jsonArray = response.getJSONArray("items"); 
                    for (int i = 0; i < jsonArray.length(); i++) { 
                        JSONObject article = jsonArray.getJSONObject(i); 
                        // 先解析基础字段
                        String authorName = article.getString("article_author"); 
                        String imageUrl = article.getString("src"); 
                        String published = article.getString("first_published_at"); 
                        String headline = article.getString("title"); 

                        // 开始解析嵌套结构:body -> paragraph -> line
                        JSONObject bodyObj = article.getJSONObject("body"); // 获取body对象
                        JSONArray paragraphs = bodyObj.getJSONArray("paragraph"); // 获取paragraph数组
                        for (int j = 0; j < paragraphs.length(); j++) {
                            JSONObject paragraph = paragraphs.getJSONObject(j);
                            JSONArray lines = paragraph.getJSONArray("line"); // 获取line数组
                            for (int k = 0; k < lines.length(); k++) {
                                String lineContent = lines.getString(k);
                                // 这里可以把lineContent添加到列表或做其他业务处理
                                Log.d("LineContent", "第" + (i+1) + "篇文章,第" + (j+1) + "段,第" + (k+1) + "行:" + lineContent);
                            }
                        }
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                    // 建议在这里处理解析异常,比如字段缺失、类型不匹配的情况
                }
            }
        },
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
                // 处理请求失败的情况,比如网络错误
            }
        });
    // 别忘了把请求添加到Volley队列里
    Volley.newRequestQueue(getApplicationContext()).add(request);
}

解析注意点:

  • 每一层嵌套都要确认字段类型(是JSONObject还是JSONArray),别搞混导致转换异常
  • 必须用try-catch包裹所有JSON解析代码,避免因API返回字段缺失导致崩溃
  • 如果你的body本身是JSONArray而不是JSONObject,只需把article.getJSONObject("body")改成article.getJSONArray("body"),根据实际API返回结构调整即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:12:42