在现代 Web 开发中,前后端分离已成为主流架构。接口之间、前后端之间的数据交互几乎全部采用 JSON 格式。Spring Boot 对 JSON 的支持极为友好,只需简单配置,即可实现对象到 JSON 的自动转换。
本节课将带你掌握:
- 如何让 Spring Boot 接口返回 JSON;
- 默认使用的 JSON 解析框架(Jackson);
- 常见数据类型(对象、List、Map)的 JSON 转换;
- 如何优雅处理
null值。
1. 使用 @RestController 返回 JSON
在 Spring Boot 中,若希望 Controller 方法返回 JSON 数据,只需使用 @RestController 注解。
1.1 @RestController 是什么?
查看其源码:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Controller @ResponseBody public @interface RestController { String value() default ""; }
✅ 它 =
@Controller+@ResponseBody
@Controller:标识这是一个 Spring MVC 控制器;@ResponseBody:将方法返回值直接写入 HTTP 响应体,并自动序列化为 JSON。
因此,只要在类上标注 @RestController,所有方法默认返回 JSON,无需额外处理。
2. Spring Boot 默认的 JSON 解析框架:Jackson
Spring Boot 默认使用 Jackson 作为 JSON 序列化/反序列化工具。
2.1 依赖关系
当你引入 spring-boot-starter-web 时,会自动包含:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-json</artifactId> </dependency>
而该 starter 又引入了 Jackson 的核心组件:
jackson-databind:核心绑定功能;jackson-datatype-jsr310:支持 Java 8 时间类型(如LocalDateTime);jackson-module-parameter-names:支持构造函数参数名识别。
💡 无需手动引入 Jackson 依赖,Spring Boot 已为你“开箱即用”。
3. 实战:返回不同类型的 JSON 数据
3.1 创建实体类 User
public class User { private Long id; private String username; private String password; // 构造方法、getter/setter 省略(建议使用 Lombok 简化) public User(Long id, String username, String password) { this.id = id; this.username = username; this.password = password; } // getter/setter... }
3.2 编写 JsonController
@RestController @RequestMapping("/json") public class JsonController { // 返回单个对象 @RequestMapping("/user") public User getUser() { return new User(1L, "倪升武", "123456"); } // 返回 List 集合 @RequestMapping("/list") public List<User> getUserList() { List<User> list = new ArrayList<>(); list.add(new User(1L, "倪升武", "123456")); list.add(new User(2L, "达人课", "123456")); return list; } // 返回 Map(混合数据类型) @RequestMapping("/map") public Map<String, Object> getMap() { Map<String, Object> map = new HashMap<>(); map.put("作者信息", new User(1L, "倪升武", "123456")); map.put("博客地址", "http://blog.itcodai.com"); map.put("CSDN地址", "http://blog.csdn.net/eson_15"); map.put("粉丝数量", 4153); return map; } }
3.3 测试结果
| 请求 URL | 返回 JSON |
GET /json/user |
{"id":1,"username":"倪升武","password":"123456"} |
GET /json/list |
[{"id":1,"username":"倪升武","password":"123456"}, {"id":2,"username":"达人课","password":"123456"}] |
GET /json/map |
{"作者信息":{"id":1,"username":"倪升武","password":"123456"},"博客地址":"http://blog.itcodai.com","CSDN地址":"http://blog.csdn.net/eson_15","粉丝数量":4153} |
✅ 可见,无论对象、集合还是混合 Map,Jackson 都能自动转换为标准 JSON。
4. 优化:统一处理 null 值
在实际项目中,数据库字段可能为 null,但前端不希望看到 null,而是希望显示为空字符串 "" 或其他默认值。
4.1 自定义 Jackson 配置
创建配置类 JacksonConfig.java:
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.*; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import java.io.IOException; @Configuration public class JacksonConfig { @Bean @Primary @ConditionalOnMissingBean(ObjectMapper.class) public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); // 配置 null 值序列化为空字符串 objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() { @Override public void serialize(Object o, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeString(""); } }); return objectMapper; } }
4.2 修改测试接口,加入 null 值
@RequestMapping("/map") public Map<String, Object> getMap() { Map<String, Object> map = new HashMap<>(); User user = new User(1L, "倪升武", null); // password 为 null map.put("作者信息", user); map.put("博客地址", "http://blog.itcodai.com"); map.put("CSDN地址", null); // 此字段为 null map.put("粉丝数量", 4153); return map; }
4.3 重启后测试结果
访问 http://localhost:8080/json/map,返回:
{ "作者信息": {"id":1,"username":"倪升武","password":""}, "CSDN地址": "", "粉丝数量": 4153, "博客地址": "http://blog.itcodai.com" }
✅ 所有
null值均被替换为空字符串"",前端无需额外判空!
5. 小结与最佳实践
| 功能 | 实现方式 |
| 返回 JSON | 使用 @RestController |
| 自动序列化 | 依赖 spring-boot-starter-web 内置 Jackson |
| 处理 null | 自定义 ObjectMapper + setNullValueSerializer |
| 支持 Java 8 时间 | 自动启用 jackson-datatype-jsr310 |
建议
- 实体类使用 Lombok 简化 getter/setter;
- 对于更复杂的 JSON 定制(如字段忽略、命名策略),可使用
@JsonInclude、@JsonProperty等注解; - 生产环境中,建议统一返回格式(如
{code, msg, data}),下一课我们将讲解 统一响应数据封装。
动手试试吧! 修改你的 User 类,加入
null字段,观察 JSON 输出变化。掌握 JSON 处理,是构建 RESTful API 的第一步!