SpringBoot定制JSON响应数据的实现

 更新时间:2025年02月10日 10:14:43   作者:小杰不秃头  
本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

最近在学习过程中发现了Jackson库的@JsonView也可以改变JSON的输出结构,并且可以更加精细的控制,我平时一般都会定义一些DTO去封装响应数据,使用这种方法可以不用创建DTO,更加优雅且高效的方式来实现。🌈

一、如何使用@JsonView这个注解?

我们可以创建多个视图,每个视图代表了一组特定的字段。然后,在控制器的方法上,我们可以通过应用这些视图来指定应该使用哪些字段来序列化返回的实体对象。这种灵活性使得我们能够轻松应对各种复杂的业务需求。

二、应用场景

  • 数据暴露级别的控制

假设你有一个用户实体(User),包含了一些基本信息(如姓名、年龄)和一些敏感信息(如密码、邮箱、身份证)。当你需要提供一个 API 来获取用户的基本信息时,你可能不希望暴露敏感信息。通过使用 @JsonView,你可以定义两个视图:一个包含基本信息,另一个包含所有信息。然后,在对应的 API 方法上,你可以使用相应的视图来控制输出的数据。

  • 根据用户角色定制数据

在某些情况下,不同的用户角色可能需要看到不同级别的数据。例如,管理员可能需要看到用户的所有信息,而普通用户只能看到基本信息。通过使用 @JsonView 和 Spring Security,你可以根据用户的角色来动态地决定应该暴露哪些数据。

  • API 版本控制

当你的 API 随时间发展并引入新功能时,可能会有多个版本的 API。在某些情况下,旧版本的 API 可能不需要包含新引入的字段。通过 @JsonView,你可以为每个 API 版本定义一个视图,并在需要时切换到相应的视图。

  • 数据聚合和拆分

在某些情况下,你可能需要将多个实体的数据聚合到一个 JSON 响应中,或者将一个大实体的数据拆分成多个小实体。通过使用 @JsonView,你可以更轻松地实现这种数据的聚合和拆分。

三、实战案例

定义视图规则:

public interface UserView {
    // 展示基本信息
     interface Basic {}
    // 没有密码
     interface WithoutPassword extends Basic {}
    // 展示所有的信息
     interface Full extends Basic {}
}

定义一个User,在属性上面添加@JSsonView注解,并指定视图

@Data
@AllArgsConstructor
public class User {
    @JsonView(UserView.Basic.class)
    private Long id;
    @JsonView(UserView.Basic.class)
    private String username;
    @JsonView(UserView.Full.class)
    private String password;
    @JsonView(UserView.Basic.class)
    private String nickName;
    @JsonView(UserView.Basic.class)
    private String email;
    @JsonView({UserView.Basic.class,UserView.WithoutPassword.class})
    private String phone;
}

在控制器方法上指定视图,一共有两种方式:注解方式和编程方式。

注解方式

@RestController
public class testController {
    @GetMapping("/user/basic")
    @JsonView(UserView.Basic.class)
    public User userBasic(){
        User user = new User(1L,"admin","123456","小杰不秃头","123456@xx.com","188xxxxxxxx");
        return user;
    }
    @GetMapping("/user/noPassword")
    @JsonView(UserView.WithoutPassword.class)
    public User userNoPassword(){
        User user = new User(1L,"admin","123456","小杰不秃头","123456@xx.com","188xxxxxxxx");
        return user;
    }
    @GetMapping("/user/full")
    @JsonView(UserView.Full.class)
    public User userFull(){
        User user = new User(1L,"admin","123456","小杰不秃头","123456@xx.com","188xxxxxxxx");
        return user;
    }
}

注意:@JsonView允许一个视图类的数组,但你只能为每个控制器方法指定一个。如果需要激活多个视图,可以使用复合接口。

对上面三个接口测试:

//   user/basic
{
  "id": 1,
  "username": "admin",
  "nickName": "小杰不秃头",
  "email": "123456@xx.com",
  "phone": "188xxxxxxxx"
}

//   user/noPassword
{
  "id": 1,
  "username": "admin",
  "nickName": "小杰不秃头",
  "email": "123456@xx.com",
  "phone": "188xxxxxxxx"
}

//   user/full
{
  "id": 1,
  "username": "admin",
  "password": "123456",
  "nickName": "小杰不秃头",
  "email": "123456@xx.com",
  "phone": "188xxxxxxxx"
}

编程方式

@RestController
public class testController {
    @GetMapping("/user/basic")
    //@JsonView(UserView.Basic.class)
    public MappingJacksonValue userBasic(){
        User user = new User(1L,"admin","123456","小杰不秃头","123456@xx.com","188xxxxxxxx");
        MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(user);
        mappingJacksonValue.setSerializationView(UserView.Basic.class);
        return mappingJacksonValue;
    }
    @GetMapping("/user/noPassword")
    //@JsonView(UserView.WithoutPassword.class)
    public MappingJacksonValue userNoPassword(){
        User user = new User(1L,"admin","123456","小杰不秃头","123456@xx.com","188xxxxxxxx");
        MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(user);
        mappingJacksonValue.setSerializationView(UserView.WithoutPassword.class);
        return mappingJacksonValue;
    }
    @GetMapping("/user/full")
    //@JsonView(UserView.Full.class)
    public MappingJacksonValue userFull(){
        User user = new User(1L,"admin","123456","小杰不秃头","123456@xx.com","188xxxxxxxx");
        MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(user);
        mappingJacksonValue.setSerializationView(UserView.Full.class);
        return mappingJacksonValue;
    }
}

//测试结果跟上面一致

注意:接口返回值必须为MappingJacksonValue。

总结 

@JsonView提供了一种灵活且强大的方式来控制序列化的 JSON 数据。通过定义视图和将它们应用到属性和控制器方法上,你可以根据需要暴露不同级别的数据,实现 API 的数据定制化。

@JsonView也可以结合其他的注解一起使用,可以更精细的控制,比如:@JsonInclude、@JsonIgnore等等

到此这篇关于SpringBoot定制JSON响应数据的实现的文章就介绍到这了,更多相关SpringBoot定制响应JSON内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Jmeter工作原理及常见错误解析

    Jmeter工作原理及常见错误解析

    这篇文章主要介绍了Jmeter工作原理及常见错误解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 教你如何编写简单的网络爬虫

    教你如何编写简单的网络爬虫

    实际的爬虫是从一系列的种子链接开始。种子链接是起始节点,种子页面的超链接指向的页面是子节点(中间节点),对于非html文档,如excel等,不能从中提取超链接,看做图的终端节点
    2013-10-10
  • Java实现Kafka生产者和消费者的示例

    Java实现Kafka生产者和消费者的示例

    这篇文章主要介绍了Java实现Kafka生产者和消费者的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Kafka集群的搭建与批量启停方式

    Kafka集群的搭建与批量启停方式

    Kafka是一个分布式的基于发布/订阅模式的消息队列,适用于大数据实时处理,本文详细介绍了如何在CentOS 7上搭建Kafka集群,包括服务器配置、配置文件修改、服务启动和关闭脚本编写
    2025-11-11
  • springboot mybatis调用多个数据源引发的错误问题

    springboot mybatis调用多个数据源引发的错误问题

    这篇文章主要介绍了springboot mybatis调用多个数据源引发的错误问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • SpringBoot项目作为文件服务器配置方式

    SpringBoot项目作为文件服务器配置方式

    本文介绍了使用Spring Boot和Kkfileview实现文件在线预览功能的配置过程,包括yml配置、webmvc配置、拦截器配置以及部署到服务器时的注意事项
    2025-12-12
  • Eclipse安装Aptana插件(注意对应版本问题)

    Eclipse安装Aptana插件(注意对应版本问题)

    这篇文章主要为大家详细介绍了Eclipse安装Aptana插件的相关资料,特别注意对应版本问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • java中如何执行xshell命令

    java中如何执行xshell命令

    这篇文章主要介绍了java中如何执行xshell命令,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Springboot 中使用Sentinel的详细步骤

    Springboot 中使用Sentinel的详细步骤

    文章介绍了如何在SpringBoot中使用Sentinel进行限流和熔断降级,首先添加依赖,配置Sentinel控制台地址,定义受保护的资源,配置流控规则,启动Sentinel控制台和SpringBoot应用,最后测试和监控,感兴趣的朋友一起看看吧
    2025-02-02
  • SpringMVC统一异常处理实例代码

    SpringMVC统一异常处理实例代码

    这篇文章主要介绍了SpringMVC统一异常处理实例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论