Spring MVC返回JSON视图的六种方式及对比详解

 更新时间:2025年08月21日 10:43:07   作者:爱的叹息  
在 Spring MVC 中返回 JSON 格式的数据是一种常见的需求,特别是在构建 RESTful Web 服务时,可以通过以下几种方式实现控制器方法返回 JSON 数据,需要的朋友可以参考下

1. 方式一:@ResponseBody 注解

作用:直接返回对象,由消息转换器(如 Jackson)序列化为 JSON。

适用场景:简单返回对象,无需自定义 HTTP 状态码或头信息。

代码示例

@Controller
public class UserController {
    @GetMapping("/user/json")
    @ResponseBody
    public User getUser() {
        return new User("John", 30); // 自动序列化为 JSON
    }
}

依赖:需引入 Jackson 库(Spring Boot 默认已集成)。

特点

  • 简单直接,但需显式标注 @ResponseBody
  • 无法直接控制 HTTP 状态码或头信息。

2. 方式二:@RestController 注解

作用:组合 @Controller@ResponseBody,所有方法默认返回 JSON。

适用场景:RESTful API 控制器,所有方法均返回 JSON。

代码示例

@RestController
public class UserController {
    @GetMapping("/user/json")
    public User getUser() {
        return new User("John", 30); // 无需 @ResponseBody
    }
}

依赖:同 @ResponseBody

特点

  • 简化配置,类级别标注即可。
  • 所有方法默认返回 JSON,适合 REST API。

3. 方式三:ResponseEntity 对象

作用:返回包装对象,可自定义 HTTP 状态码、头信息和响应体。

适用场景:需要返回特定状态码(如 404、201)或自定义头信息。

代码示例

@RestController
public class UserController {
    @GetMapping("/user/json")
    public ResponseEntity<User> getUser() {
        User user = new User("John", 30);
        return ResponseEntity
            .status(HttpStatus.CREATED)
            .header("X-Custom-Header", "value")
            .body(user);
    }
}

依赖:无需额外依赖。

特点

  • 灵活性高,可控制状态码、头和响应体。
  • 适合复杂响应场景。

4. 方式四:@JsonView 控制序列化字段

作用:通过注解控制对象序列化的字段,避免暴露敏感数据。

适用场景:需要根据场景选择性序列化字段(如不同 API 版本)。

代码示例

// 定义视图类
class Views {
    static class Public {} 
    static class Internal extends Public {}
}

@RestController
public class UserController {
    @JsonView(Views.Public.class)
    @GetMapping("/user/json/public")
    public User getPublicUser() {
        return new User("John", 30); // 只序列化 @JsonView(Views.Public) 的字段
    }

    @JsonView(Views.Internal.class)
    @GetMapping("/user/json/internal")
    public User getInternalUser() {
        return new User("John", 30); // 序列化 Public 和 Internal 的字段
    }
}

// User 类字段配置
public class User {
    @JsonView(Views.Public.class)
    private String name;
    
    @JsonView(Views.Internal.class)
    private int age;
    // ...
}

依赖:Jackson 的 @JsonView 注解。

特点

  • 精细控制序列化字段。
  • 适合不同接口 暴露不同数据。

5. 方式五:@RequestBody 反序列化 + @ResponseBody 序列化

作用:处理 POST/PUT 请求的 JSON 反序列化,同时返回 JSON。

适用场景:需要双向 JSON 交互(如 REST API)。

代码示例

@RestController
public class UserController {
    @PostMapping("/user/save")
    public User saveUser(@RequestBody User user) {
        // 反序列化 JSON 请求体到 User 对象
        return user; // 序列化为 JSON 响应
    }
}

依赖:Jackson。

特点

  • 支持请求体反序列化和响应体序列化。
  • 适合 RESTful CRUD 操作。

6. 新增方式六:MappingJackson2JsonView

作用:通过视图解析器将模型数据转换为 JSON 格式的视图。

适用场景:需要兼容旧代码或特定视图配置(如传统基于视图的 MVC 流程)。

代码示例

@Controller
public class UserController {
    @GetMapping("/user/json")
    public String getUser(Model model) {
        User user = new User("John", 30);
        model.addAttribute("user", user); // 将数据存入模型
        return "jsonView"; // 视图名称
    }
}

视图配置

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Bean
    public View jsonView() {
        MappingJackson2JsonView view = new MappingJackson2JsonView();
        view.setExtractValueFromSingleKeyModel(true); // 自动提取模型中的值
        return view;
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.enableContentNegotiation(); // 启用内容协商
        registry.viewResolver((s, locale) -> jsonView());
    }
}

依赖:需引入 org.springframework:spring-webmvc 和 Jackson。

特点

  • 传统视图方式:依赖视图解析器和模型数据,流程与 JSP 等视图一致。
  • 配置复杂:需手动配置视图和视图解析器。
  • 灵活性低:无法直接控制 HTTP 状态码或头信息。
  • 适用场景:在需要与传统视图(如 JSP)共存时使用。

对比表格(新增 MappingJackson2JsonView)

方式适用场景控制能力代码复杂度依赖是否需要视图解析器
@ResponseBody简单返回对象仅返回数据,无状态/头控制Jackson
@RestControllerREST API 控制器同 @ResponseBody,简化配置Jackson
ResponseEntity需要自定义状态码/头信息状态码、头、数据全控制无额外依赖
@JsonView需要控制序列化字段粒度控制字段序列化Jackson 的 @JsonView
@RequestBody + @ResponseBody双向 JSON 交互(如 POST/PUT)反序列化请求体,序列化响应体Jackson
MappingJackson2JsonView兼容旧代码或特定视图配置仅序列化模型数据,无状态/头控制Spring MVC + Jackson

关键差异总结(新增 MappingJackson2JsonView)

控制粒度

  • ResponseEntity 提供最高控制(状态码、头、数据)。
  • @JsonView 用于字段级序列化控制。
  • MappingJackson2JsonView 仅能序列化模型数据,无法控制状态码或头。

代码简洁性

  • @RestController@ResponseBody 更简洁。
  • MappingJackson2JsonView 需要额外配置视图和解析器,代码复杂度较高。

适用场景

  • MappingJackson2JsonView:适合需要与传统视图(如 JSP)共存的场景,或在旧代码中逐步迁移时使用。
  • 其他方式(如 @RestController)更推荐用于现代 RESTful API 开发。

依赖与配置

  • MappingJackson2JsonView 需要显式配置视图和视图解析器,而其他方式依赖注解和消息转换器。

注意事项

  • MappingJackson2JsonView 的局限性
    • 需要通过模型传递数据,无法直接返回对象。
    • 无法直接设置 HTTP 状态码或头信息,需通过 @ResponseStatusHandlerInterceptor 间接实现。
  • 推荐场景
    • 在需要与传统视图(如 JSP)共存的项目中,MappingJackson2JsonView 可作为过渡方案。
    • 现代项目中更推荐使用 @RestControllerResponseEntity,因其简洁性和灵活性。

通过新增 MappingJackson2JsonView 的对比,可以更全面地理解 Spring MVC 返回 JSON 的多种方式及其适用场景。

以上就是Spring MVC返回JSON视图的六种方式及对比详解的详细内容,更多关于Spring MVC返回JSON视图的资料请关注脚本之家其它相关文章!

相关文章

  • 如何使用HttpClient发送java对象到服务器

    如何使用HttpClient发送java对象到服务器

    这篇文章主要介绍了如何使用HttpClient发送java对象到服务器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • MyBatis实现动态查询、模糊查询功能

    MyBatis实现动态查询、模糊查询功能

    这篇文章主要介绍了MyBatis实现动态查询、模糊查询功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • Java中的接口和抽象类用法实例详解

    Java中的接口和抽象类用法实例详解

    这篇文章主要介绍了Java中的接口和抽象类用法,结合实例形式较为详细的分析了Java中关于接口和抽象类的概念、定义、用法与相关注意事项,需要的朋友可以参考下
    2015-12-12
  • Spring Boot统一处理全局异常的实战教程

    Spring Boot统一处理全局异常的实战教程

    最近在做项目时需要对异常进行全局统一处理,所以下面这篇文章主要给大家介绍了关于Spring Boot统一处理全局异常的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2021-12-12
  • Spring Boot拦截器Interceptor与过滤器Filter详细教程(示例详解)

    Spring Boot拦截器Interceptor与过滤器Filter详细教程(示例详解)

    本文详细介绍了SpringBoot中的拦截器(Interceptor)和过滤器(Filter),包括它们的定义、作用范围、使用场景、实现步骤、执行顺序、常见问题及解决方案,感兴趣的朋友跟随小编一起看看吧
    2025-03-03
  • Java获取json数组对象的实例讲解

    Java获取json数组对象的实例讲解

    下面小编就为大家分享一篇Java获取json数组对象的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • 解决JDBC连接Mysql长时间无动作连接失效的问题

    解决JDBC连接Mysql长时间无动作连接失效的问题

    这篇文章主要介绍了解决JDBC连接Mysql长时间无动作连接失效的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • idea如何生成springboot单元测试用例

    idea如何生成springboot单元测试用例

    这篇文章主要介绍了idea生成springboot单元测试用例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • JPA与mybatis-plus不兼容问题的解决

    JPA与mybatis-plus不兼容问题的解决

    本文主要介绍了JPA与mybatis-plus不兼容问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • synchronized 和 Lock 的异同点(如何让选择)

    synchronized 和 Lock 的异同点(如何让选择)

    这篇文章主要介绍了 synchronized和Lock的异同点(如何让选择),文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09

最新评论