java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring MVC返回JSON视图

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

作者:爱的叹息

在 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 默认已集成)。

特点

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

特点

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。

特点

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。

特点

对比表格(新增 MappingJackson2JsonView)

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

关键差异总结(新增 MappingJackson2JsonView)

控制粒度

代码简洁性

适用场景

依赖与配置

注意事项

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

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

您可能感兴趣的文章:
阅读全文