如何从HttpServletRequest读取JSON数组并解析指定字段?
解决Servlet中读取HttpServletRequest里JSON数组的问题
嘿,我懂你现在的难题啦!你用request.getParameterValues("sort")只能拿到一整个JSON字符串,没法直接提取里面的fiscalYear和DESC是吧?这是因为getParameterValues只适合读取普通表单格式的参数,而你的sort是个JSON数组,得先把这个字符串解析成Java对象才能拿到具体的值。
下面给你两种常用的解决思路,都是Java Web里处理JSON的常规操作:
方法一:用Jackson解析成Map列表(快速上手)
Jackson是Java生态里非常流行的JSON解析库,先确保你的项目里引入了它的依赖(比如Maven项目可以在pom.xml里加下面的依赖):
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 建议用最新稳定版本 --> </dependency>
然后修改你的doPost方法:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 先拿到sort对应的JSON字符串(用getParameter就行,因为只有一个值) String sortJson = request.getParameter("sort"); // 初始化Jackson的ObjectMapper ObjectMapper objectMapper = new ObjectMapper(); // 把JSON数组解析成List<Map>,这样就能直接取key对应的value List<Map<String, String>> sortList = objectMapper.readValue( sortJson, new TypeReference<List<Map<String, String>>>() {} ); // 遍历列表,取出你需要的property和direction for (Map<String, String> sortItem : sortList) { String property = sortItem.get("property"); String direction = sortItem.get("direction"); System.out.println("property: " + property); System.out.println("direction: " + direction); } }
运行之后,就能输出你想要的内容:
property: fiscalYear direction: DESC
方法二:自定义实体类解析(更规范)
如果你的项目需要多次处理这类排序参数,建议自定义一个实体类来对应JSON结构,这样代码更清晰、可维护性更高:
首先定义Sort类:
class Sort { private String property; private String direction; // Jackson解析需要无参构造函数,必须加上 public Sort() {} // 生成getter和setter方法 public String getProperty() { return property; } public void setProperty(String property) { this.property = property; } public String getDirection() { return direction; } public void setDirection(String direction) { this.direction = direction; } }
然后修改doPost方法,直接解析成Sort对象的列表:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String sortJson = request.getParameter("sort"); ObjectMapper objectMapper = new ObjectMapper(); // 解析成Sort对象的列表 List<Sort> sortList = objectMapper.readValue( sortJson, new TypeReference<List<Sort>>() {} ); // 遍历取值 for (Sort sort : sortList) { System.out.println("property: " + sort.getProperty()); System.out.println("direction: " + sort.getDirection()); } }
额外提醒
如果你的请求是整个请求体都是JSON(不是表单参数里嵌套JSON字符串),那就要先读取整个请求体再解析,代码示例如下:
// 读取请求体内容 String requestBody = new BufferedReader( new InputStreamReader(request.getInputStream()) ).lines().collect(Collectors.joining("\n")); // 解析整个requestBody,提取sort数组 ObjectMapper objectMapper = new ObjectMapper(); Map<String, Object> requestMap = objectMapper.readValue(requestBody, Map.class); List<Map<String, String>> sortList = (List<Map<String, String>>) requestMap.get("sort"); // 之后的取值操作和上面一致
内容的提问来源于stack exchange,提问作者Anmol Duggal
相关产品推荐
相关产品推荐

