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


相关文章
|
2月前
|
JSON 前端开发 Java
Spring Boot 封装统一返回的数据结构
本课讲解如何设计统一的JSON响应结构,通过泛型类`JsonResult&lt;T&gt;`封装返回数据,规范包含code、msg、data的标准格式,提升前后端协作效率与API可维护性。
|
JSON 前端开发 JavaScript
解锁JSON的奇妙世界:从基础到高级应用,一文搞懂JSON的妙用(上)
解锁JSON的奇妙世界:从基础到高级应用,一文搞懂JSON的妙用(上)
528 0
解锁JSON的奇妙世界:从基础到高级应用,一文搞懂JSON的妙用(上)
|
Java 应用服务中间件 Maven
Spring Boot项目打war包(idea:多种方式)
Spring Boot项目打war包(idea:多种方式)
2098 1
|
JSON 前端开发 Java
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
609 0
|
2月前
|
JSON Java fastjson
Spring Boot返回Json数据及数据封装
Spring Boot默认使用Jackson处理JSON,通过@RestController可直接返回JSON数据。本文详解Jackson与FastJson的配置与对比,并封装统一的JSON返回结构,提升前后端交互规范性与开发效率。
|
2月前
|
JSON fastjson Java
Spring Boot返回Json数据及数据封装
Spring Boot中,通过@RestController可自动返回Json数据,默认使用Jackson框架。该注解等价于@Controller + @ResponseBody。可通过配置自定义null值处理方式,也可替换为FastJson等其他解析器,并封装统一的返回结构(如包含code、msg、data的JsonResult),提升前后端交互规范性与可维护性。
|
11月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 &quot;&quot;,Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
596 0
|
11月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
1588 0
|
7月前
|
人工智能 JSON Java
Spring Boot 如何接收并处理不确定类型的请求参数?
在 Spring Boot 中,当需要处理结构不确定的 JSON 数据时,可以使用 `Map` 类型灵活接收键值对数据。对于更复杂的场景,可通过 Jackson 注解支持多态类型、自定义反序列化器,或在接收后动态解析 JSON 数据,提升处理灵活性和扩展性。
243 0
|
XML Java Maven
创建第一个springboot项目、用springboot实现页面跳转、@Controller和@RestController的区别
这篇文章介绍了如何创建第一个Spring Boot项目,实现页面跳转,以及`@Controller`和`@RestController`的区别,并提供了代码示例和配置说明。
创建第一个springboot项目、用springboot实现页面跳转、@Controller和@RestController的区别