如何在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>
额外提示
- 建议把类名改成符合Java命名规范的
GetSleepData(首字母大写),这是Java开发的通用约定。 - 如果项目允许,推荐使用JSTL标签库代替脚本段(
<% %>)来遍历集合,代码会更优雅易维护。
内容的提问来源于stack exchange,提问作者Y.Baek
相关产品推荐
相关产品推荐

