SpringBoot定制JSON响应数据的实现

2025-02-10 16:50

本文主要是介绍SpringBoot定制JSON响应数据的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

前言

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

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

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

二、应用场景

  • 数据暴露级别的控制

假设你有一个用户实体(User),包含了一些基本信息(如姓名、年龄)和一些敏感信息(如密码、邮箱、身份证)。当你需要提供一个 API 来获取用户的基本信息时,你可能不希望暴露敏感信息。通China编程过使用 @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": "18编程8xxxxxxxx"
}

//   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(UserVieCBfmHFw.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);
       China编程 return mappingJacksonValue;
    }
}

//测试结果跟上面一致

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

总结 

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

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

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

这篇关于SpringBoot定制JSON响应数据的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153384

相关文章

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

java streamfilter list 过滤的实现

《javastreamfilterlist过滤的实现》JavaStreamAPI中的filter方法是过滤List集合中元素的一个强大工具,可以轻松地根据自定义条件筛选出符合要求的元素,本文就来... 目录1. 创建一个示例List2. 使用Stream的filter方法进行过滤3. 自定义过滤条件1. 定

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

Java强制转化示例代码详解

《Java强制转化示例代码详解》:本文主要介绍Java编程语言中的类型转换,包括基本类型之间的强制类型转换和引用类型的强制类型转换,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录引入基本类型强制转换1.数字之间2.数字字符之间引入引用类型的强制转换总结引入在Java编程语言中,类型转换(无论

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

SpringCloud之consul服务注册与发现、配置管理、配置持久化方式

《SpringCloud之consul服务注册与发现、配置管理、配置持久化方式》:本文主要介绍SpringCloud之consul服务注册与发现、配置管理、配置持久化方式,具有很好的参考价值,希望... 目录前言一、consul是什么?二、安装运行consul三、使用1、服务发现2、配置管理四、数据持久化总

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i