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

如何在JSP中使用JSONArray变量并遍历获取完整数据

解决JSP中仅获取到最后一条JSON数据的问题

问题根源

你当前的getSleepData类里,sleep和sdate是单个字符串变量,在遍历jsonrow数组时,每一次循环都会用当前元素的值覆盖这两个变量,循环结束后它们自然就只保留了最后一条数据的内容。要展示所有数据,你需要把这两个变量改成集合类型来存储所有条目。

修改后的Java类代码

package graph;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;

public class getSleepData {
    String arraysdate, arraysleep;
    // 把单个字符串改成List来存储所有数据
    List<String> sleepList = new ArrayList<>();
    List<String> sdateList = new ArrayList<>();

    {
        try {
            String url = "http://220.81.195.81:4000/sleep";
            URL obj = new URL(url);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
            int responseCode = con.getResponseCode();
            System.out.println("\nSending 'GET' request to URL : " + url);
            System.out.println("Response Code : " + responseCode);

            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

            JSONObject jsonObject = new JSONObject(response.toString());
            JSONArray jsonmetadata = jsonObject.getJSONArray("metaData");
            JSONArray jsonrow = jsonObject.getJSONArray("rows");

            arraysleep = (String) ((JSONObject) jsonmetadata.get(0)).get("name");
            arraysdate = (String) ((JSONObject) jsonmetadata.get(1)).get("name");
            System.out.println("col1 :" + arraysleep);
            System.out.println("col2 :" + arraysdate);

            // 遍历数组时,把每条数据添加到List中,而不是覆盖单个变量
            for (int i = 0; i < jsonrow.length(); i++) {
                String sleep = (String) ((JSONObject) jsonrow.get(i)).get("SLEEP");
                String sdate = (String) ((JSONObject) jsonrow.get(i)).get("SDATE");
                sleepList.add(sleep);
                sdateList.add(sdate);
                System.out.println("sleep : " + sleep);
                System.out.println("sdate : " + sdate);
            }
        } catch (IOException e) {
            // 补充异常捕获,避免程序崩溃
            e.printStackTrace();
        }
    }

    public String getArraysleep() { return arraysleep; }
    public String getArraysdate() { return arraysdate; }
    // 新增获取List的方法
    public List<String> getSleepList() { return sleepList; }
    public List<String> getSdateList() { return sdateList; }
}

修改后的JSP代码

在JSP里,你可以通过遍历List来展示所有的睡眠数据和日期:

<body>
    <% getSleepData SData = new getSleepData(); %>
    <%=SData.getArraysleep()%>
    <hr>
    <%=SData.getArraysdate()%>
    <hr>

    <!-- 用表格遍历展示所有数据 -->
    <table border="1">
        <tr>
            <th><%=SData.getArraysleep()%></th>
            <th><%=SData.getArraysdate()%></th>
        </tr>
        <% 
            List<String> sleepList = SData.getSleepList();
            List<String> sdateList = SData.getSdateList();
            for(int i=0; i<sleepList.size(); i++){
        %>
        <tr>
            <td><%=sleepList.get(i)%></td>
            <td><%=sdateList.get(i)%></td>
        </tr>
        <% } %>
    </table>
</body>

额外提示

  1. 建议把类名改成符合Java命名规范的GetSleepData(首字母大写),这是Java开发的通用约定。
  2. 如果项目允许,推荐使用JSTL标签库代替脚本段(<% %>)来遍历集合,代码会更优雅易维护。

内容的提问来源于stack exchange,提问作者Y.Baek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:03:37