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

如何从指定JSON提取特定值到Java ArrayList并在JSP中使用

没问题,我来一步步教你怎么实现从JSON提取数据到Java ArrayList,再在JSP里用上它~

第一步:Java端解析JSON到ArrayList

1. 先定义实体类

JSON里的stops是一个对象数组,每个对象包含固定字段,我们先写一个对应的Java实体类来映射这些数据:

public class Stop {
    private String atcocode;
    private double longitude;
    private double latitude;
    private int distance;

    // 必须保留无参构造函数,JSON库需要它实例化对象
    public Stop() {}

    // 生成所有字段的getter和setter方法,JSON库依赖这些来赋值和读取数据
    public String getAtcocode() {
        return atcocode;
    }

    public void setAtcocode(String atcocode) {
        this.atcocode = atcocode;
    }

    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    public int getDistance() {
        return distance;
    }

    public void setDistance(int distance) {
        this.distance = distance;
    }
}

2. 用JSON库解析数据到ArrayList

这里用Jackson(Java Web项目中最常用的JSON处理库)来解析。首先在项目中引入Jackson依赖,如果是Maven项目,在pom.xml中添加:

<dependencies>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.15.2</version> <!-- 替换为最新稳定版即可 -->
    </dependency>
</dependencies>

然后编写解析代码,假设你已经拿到了目标JSON字符串:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.List;

public class JsonParser {
    public static List<Stop> parseStopsFromJson(String jsonStr) {
        List<Stop> stopList = new ArrayList<>();
        try {
            ObjectMapper objectMapper = new ObjectMapper();
            // 解析整个JSON为JsonNode节点
            JsonNode rootNode = objectMapper.readTree(jsonStr);
            // 提取stops数组节点
            JsonNode stopsNode = rootNode.get("stops");
            // 将数组转换为ArrayList<Stop>
            stopList = objectMapper.convertValue(
                stopsNode,
                new com.fasterxml.jackson.core.type.TypeReference<ArrayList<Stop>>() {}
            );
        } catch (Exception e) {
            e.printStackTrace();
            // 实际项目中建议用自定义异常处理,不要直接打印堆栈
        }
        return stopList;
    }
}

第二步:在JSP中使用这个ArrayList

通常我们会在Servlet中完成JSON解析,再将ArrayList传递给JSP页面展示。

1. Servlet中传递ArrayList到JSP

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/StopListServlet")
public class StopListServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 这里替换为你实际获取JSON字符串的逻辑,比如调用接口拿到JSON
        String jsonStr = "{ \"page\": 1, \"rpp\": 3, \"total\": 3294, \"request_time\": \"2018-04-23T16:10:20+01:00\", \"stops\": [ { \"atcocode\": \"370023715\", \"longitude\": -1.46616, \"latitude\": 53.38248, \"distance\": 57 }, { \"atcocode\": \"370027281\", \"longitude\": -1.46583, \"latitude\": 53.38228, \"distance\": 77 }, { \"atcocode\": \"370022803\", \"longitude\": -1.46616, \"latitude\": 53.38227, \"distance\": 80 } ] }";
        
        // 解析JSON得到站点列表
        List<Stop> stopList = JsonParser.parseStopsFromJson(jsonStr);
        
        // 将列表存入request属性,供JSP读取
        request.setAttribute("stopList", stopList);
        
        // 转发到JSP页面
        request.getRequestDispatcher("/stopList.jsp").forward(request, response);
    }
}

2. JSP页面遍历展示ArrayList

推荐使用JSTL标签来遍历数据,代码更简洁易维护。首先在JSP中引入JSTL核心标签库:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>附近公交站点列表</title>
</head>
<body>
    <h1>附近公交站点</h1>
    <table border="1" cellpadding="8">
        <tr>
            <th>ATCO码</th>
            <th>经度</th>
            <th>纬度</th>
            <th>距离(米)</th>
        </tr>
        <!-- 用c:forEach遍历stopList,每次循环将当前对象赋值给stop变量 -->
        <c:forEach items="${stopList}" var="stop">
            <tr>
                <td>${stop.atcocode}</td>
                <td>${stop.longitude}</td>
                <td>${stop.latitude}</td>
                <td>${stop.distance}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

如果项目还没引入JSTL依赖,Maven项目需要添加:

<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

额外注意点

  • 如果实体类字段名和JSON字段名不一致,可以用Jackson的@JsonProperty注解映射,比如实体类字段是atcoCode,JSON是atcocode,就加@JsonProperty("atcocode")在字段上。
  • 解析JSON时一定要处理异常,避免因JSON格式错误导致程序崩溃。
  • 不推荐在JSP中使用脚本代码(<% ... %>)遍历,会让页面逻辑和展示代码混杂,维护性差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:13:47