Java 返回 JSON 数组的多种实现方式详解**
在现代 Web 开发中,JSON(JavaScript Object Notation)因其轻量级、易解析的特性,成为了前后端数据交换的主流格式,在 Java 后端开发中,经常需要将数据以 JSON 数组的形式返回给前端,本文将详细介绍几种在 Java 中返回 JSON 数组的常用方法,包括使用原生 Servlet、第三方库(如 Jackson、Gson、Fastjson)以及 Spring Boot 框架中的便捷实现。
为什么需要返回 JSON 数组?
JSON 数组是值的有序集合,用方括号 [] 表示,当后端需要返回多个对象列表时,
- 用户列表
- 商品列表
- 订单详情列表
- 查询结果集
将这些数据封装成 JSON 数组返回,前端可以方便地遍历和处理。
准备工作:添加 JSON 处理库依赖
除了使用原生 Servlet 手动拼接(不推荐),通常我们会借助成熟的 JSON 处理库来简化操作并避免错误,以下是几种常用库的 Maven 依赖:
-
Jackson (Spring Boot 默认内置)
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 使用最新稳定版本 --> </dependency> -
Gson (Google)
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> <!-- 使用最新稳定版本 --> </dependency> -
Fastjson (阿里巴巴)
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.40</version> <!-- 使用最新稳定版本 --> </dependency>
返回 JSON 数组的方法实现
假设我们有一个简单的 Java 类 User:
public class User {
private int id;
private String name;
private int age;
// 构造方法、getters 和 setters
public User() {}
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
@Override
public String toString() {
return "User{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}';
}
}
并且我们有一个 List<User> 需要转换成 JSON 数组返回。
使用 Servlet + Jackson/Gson/Fastjson 手动处理 (传统方式)
这种方式不依赖框架,适合在纯 Servlet 环境中使用。
-
获取数据
List<User> userList = new ArrayList<>(); userList.add(new User(1, "张三", 25)); userList.add(new User(2, "李四", 30)); userList.add(new User(3, "王五", 28));
-
设置响应头并转换
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 获取数据 List<User> userList = new ArrayList<>(); userList.add(new User(1, "张三", 25)); userList.add(new User(2, "李四", 30)); userList.add(new User(3, "王五", 28)); // 2. 设置响应头 response.setContentType("application/json;charset=UTF-8"); response.setCharacterEncoding("UTF-8"); // 3. 使用 Jackson 转换并写出 ObjectMapper objectMapper = new ObjectMapper(); String jsonArray = objectMapper.writeValueAsString(userList); response.getWriter().write(jsonArray); // 或者使用 Gson // Gson gson = new Gson(); // String jsonArray = gson.toJson(userList); // response.getWriter().write(jsonArray); // 或者使用 Fastjson // String jsonArray = JSON.toJSONString(userList); // response.getWriter().write(jsonArray); }
在 Spring Boot 中返回 JSON 数组 (推荐)
Spring Boot 对 JSON 返回提供了极佳的支持,通常只需要返回数据对象,框架会自动将其序列化为 JSON。
-
创建 Controller
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; @RestController @RequestMapping("/api/users") public class UserController { @GetMapping public List<User> getUsers() { List<User> userList = new ArrayList<>(); userList.add(new User(1, "张三", 25)); userList.add(new User(2, "李四", 30)); userList.add(new User(3, "王五", 28)); return userList; // 直接返回 List } // 也可以返回一个包含数组的对象 @GetMapping("/wrapped") public UserListWrapper getUserListWrapper() { List<User> userList = new ArrayList<>(); userList.add(new User(1, "张三", 25)); userList.add(new User(2, "李四", 30)); userList.add(new User(3, "王五", 28)); return new UserListWrapper(userList); } } // 用于包装列表的简单类 class UserListWrapper { private List<User> users; public UserListWrapper(List<User> users) { this.users = users; } public List<User> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; } } -
自动序列化 当访问
/api/users时,Spring Boot 会自动使用 Jackson (默认) 将List<User>序列化为 JSON 数组:[ { "id": 1, "name": "张三", "age": 25 }, { "id": 2, "name": "李四", "age": 30 }, { "id": 3, "name": "王五", "age": 28 } ]访问
/api/users/wrapped时,会返回:{ "users": [ { "id": 1, "name": "张三", "age": 25 }, { "id": 2, "name": "李四", "age": 30 }, { "id": 3, "name": "王五", "age": 28 } ] }
Spring Boot 的优势:
- 自动配置:Spring Boot 自动配置了 Jackson (或 Gson, 如果配置了)。
- 简洁性:开发者只需关注业务逻辑,直接返回 Java 对象即可。
- 灵活性:可以通过
@ResponseBody注解(在@RestController中已默认包含)或返回自定义对象来控制输出格式。
使用 @ResponseBody 注解 (Spring MVC)
在标准的 Spring MVC 项目中,如果使用 @Controller 而不是 @RestController,可以在方法上添加 @ResponseBody 注解来表明返回的内容不是视图名称,而是直接写入响应体的数据。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.ArrayList;
import java.util.List;
@Controller
public class UserControllerMvc {
@GetMapping("/api/users/mvc")
@ResponseBody
public List<User> getUsersMvc() {
List<User> userList = new ArrayList<>();
userList.add(new User(1, "赵六", 35));
userList.add(new User(2, "钱七", 40));
return userList;
}
}
这样,List<User> 也会被序列化为 JSON 数组返回。
高级定制与注意事项
-
日期格式化:默认情况下,日期时间字段可能格式不符合需求,可以通过
@JsonFormat注解在字段上指定格式。@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime;
或者在配置类中全局配置 Jackson 的日期格式。
-
字段过滤:有时需要排除某些字段(如密码),可以使用
@JsonIgnore注解在字段上,或使用@JsonIgnoreProperties在类上。



还没有评论,来说两句吧...