Spring Boot 返回 JSON 数据及数据封装

简介: 本课讲解Spring Boot中JSON处理:通过@RestController返回JSON,利用内置Jackson实现对象、List、Map自动序列化,并自定义配置优雅处理null值,提升前后端交互体验。

在现代 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 的第一步!


相关文章
|
12天前
|
数据采集 人工智能 安全
|
7天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
344 164
|
6天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
345 155
|
7天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
581 4
|
15天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
1019 7

热门文章

最新文章