Spring Boot+原生注解@JsonView 轻松过滤字段,真的优雅!

@JsonView 详解(理论+实战) @JsonView 对比场景 数据库按需查询【推荐】 Dao查询列表的时候,仅仅查询基础信息,不包含密码信息;查询详情的时候,就把更详细的详细查询并返回; 定义不同的前端视图对象 查询的时候,都把详细的查询出来,定义不同的响应对象并赋值返回,List<UserSimpleInfo>和UserDetailsInfo 定义特定的对象转换工具 业务对象到响应的视图对象转换时,定义一个特殊的转换工具类,根据需要,忽略掉对应的值,比如之前介绍的:【还用... 阅读详情

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

👉这是一个或许对你有用的开源项目

国产Star破10w的开源项目,前端包括管理后台、微信小程序,后端支持单体、微服务架构

RBAC权限、数据权限、SaaS多租户、商城、支付、工作流、大屏报表、ERP、CRM、AI大模型、IoT物联网等功能:

  • 多模块:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • 微服务:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK17/21+SpringBoot3、JDK8/11+Spring Boot2双版本 

来源:网络


前后端分离的项目中,使用Json字符串 来完成前后端之间的通信。在默认情况下,只要前端发起请求,就会返回对象的所有 字段。但有的时候,后端不能把所有字段全部返回。

一方面,是因为有些字段前端不需要,返回过多的数据会占用网络带宽;

另一方面是出于安全性 考虑,比如,不可以将密码返回给前端,否则,网站攻击者可以用REST工具直接获取密码。

而JsonView的作用,就是用来控制C层返回哪些字段 的。

@JsonView 它是 Jackson 库中的一个强大注解。通过定义不同的视图类(通常为接口或类),并在实体类的字段上使用 @JsonView 注解标记该字段在哪个视图中可见,同时在控制器方法中通过 @JsonView 注解指定返回的视图,就可以灵活控制返回的字段内容,实现了根据不同场景动态选择序列化字段的目的,大大提高了代码的简洁性和可维护性。

JsonView的效果

通过以下几个实例的对比,来展示JsonView的效果。

以下的代码,我们通过一个小Demo来演示:

在这个小小的教务系统中,有三种实体——教师、学生、班级 ,

为了清晰的展示实体关系,提供简单的E-R图:

由图可知: 班级和教师是多对一 的关系, 学生和班级是多对一 的关系 因此,如果查询学生,班级会包含在学生的字段中,教师会包含在班级的字段中。 这是典型的“对象套对象套对象”的例子。

下面实体的代码供参考(可略过):

1、不使用JsonView

在不使用JsonView的情况下,使用REST工具直接取出一个学生,返回了学生的所有字段,也包含关联查询 得到的对象:

{
    "id":1,
    "name":"学生1",
    "sno":"123456",
    "klass":{
        "id":1,
        "teacher":{
            "id":1,
            "name":"张三",
            "sex":false,
            "username":"zhangsan",
            "email":"123@123.com"
        },
        "name":"班级1"
    }
}

因此,很容易得到结论一:

不使用JsonView时,返回所有字段,包括外键关联对象的所有字段

2、在实体的字段上使用JsonView

在原来的基础上,对姓名和学号字段分别使用JsonView,同时,定义对应的接口:

在C层控制器中加入NameJsowView: (注意:此时只有姓名 ,并没有加入学号和班级)

返回结果如下:

{
    "name":"学生1"
}

由于我们在C层只使用了姓名的字段,除了姓名,其他字段均不返回。

因此可以得出结论二:

对于已经定义JsowView的对象,C层只返回注解中的JsonView接口里面包含的字段,其他字段一概不返回。

3、在实体的关联对象中使用JsonView

前一节的基础上,把C层的注解由 @JsonView(Student.NameJsonView.class) 改为**@JsonView(Student.KlassJsonView.class)** 来返回学生对象关联的班级。

这次的返回结果比较有意思,只返回了空的Klass,里面一个字段也没有:

{
    "klass":
        {
            
        }
}

所以,结论三:通过外键关联的对象,使用JsonView只会返回关联空对象本身,而不返回关联对象的任何字段。

4、在关联对象的字段中使用JsonView

为了解决结论三的问题,我们需要像上文一样,在学生关联的班级 实体中也启用JsonView。

然后新建一个接口,分别继承班级 字段以及班级实体中的姓名 、教师 等其他字段:

public interface GetByIdJsonView extends Student.KlassJsonView, Klass.NameJsonView, Klass.TeacherJsonView {}

把这个新接口写到C层方法的注解上:

@GetMapping("{id}")
    @JsonView(GetByIdJsonView.class)
    public Student getById(@PathVariable Long id) {
        return this.studentService.findById(id);
    }

再次运行,查看返回结果:

{
    "klass":
    {
        "teacher":{ },
        "name":"班级1"
    }
}

符合预期,因此,结论四:

如果想返回关联对象中的字段,只需要继承这个实体中,相关字段的JsonView接口即可。

细心的你可以发现,Teacher中依然没有字段,如果也想返回Teacher的字段,只需要在接口中继续继承即可。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

JsonView的使用方法

接下来说具体如何在Spring的项目中应用JsonView。

1、在实体类中定义接口

需要记住接口名称

// 定义了一个接口,用于JsonView控制返回字段
    public interface SnoJsonView {}

2、在实体中的字段中加入注解

找到一个字段,加入**@JsonView(XXXJsonView.class)** ,名称与刚才写的接口名称相同。

@JsonView(SnoJsonView.class)
    private String sno;

3、继承接口

实际的项目中,不可能只返回一个字段,如果返回多个字段,那就在C层再定一个接口,继承所以要返回字段的接口即可。 原则上,每个控制器方法,都必须有唯一的JsonView接口,接口名与方法名相同,不能混用。

定义一个与C层方法名相同的接口,继承业务逻辑中需要返回的所有字段:

public interface GetByIdJsonView extends Student.KlassJsonView, Student.NameJsonView, Student.SnoJsonView {}

4、在C层方法上加入注解

最后一步,就是把刚才的接口,加到要控制字段的C层方法上:

@GetMapping("{id}")
    @JsonView(GetByIdJsonView.class)
    public Student getById(@PathVariable Long id) {
        return this.studentService.findById(id);
    }

到此,就可以实现用JsonView控制返回字段了。 这种做法的优点在于: 实体层中,接口名 和字段名 一致,到C层引用时,就可以根据名称知道这个接口控制哪个字段; 控制器中,接口名 与方法名 一致,通过接口名可以知道是这个方法返回哪些字段。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

总结

前后端分离的项目中,使用Json字符串 来完成前后端之间的通信,但有的时候,后端不能把所有字段全部返回,因此可以使用JsonView,来控制C层返回哪些字段 。

如果不使用JsonView,默认返回所有字段 ,包括外键关联对象的所有信息; 如果使用JsonView,只返回接口中声明 的所有字段,如果出现关联对象,只返回关联对象本身,而不返回其中的字段。 JsonView接口可以通过继承 ,来实现返回不同字段的组合。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,“长按”或“扫描”下方二维码噢:

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
@JsonView注解大白话简介说明 阅读详情

相关推荐

@JsonView 在 Spring Boot 中的实战指南(附完整 Demo + 多接口复用场景)

摘要:本文介绍了Spring Boot中使用@JsonView注解实现动态字段控制的实战方案。通过定义视图接口(如BaseView、PhoneView)绑定实体类字段,可在不同接口(A/B接口复用手机号字段)中灵活控制JSON返回内容,避免创建冗余DTO类。文章包含完整Demo演示,展示如何通过视图继承实现字段复用,解决多场景下同一实体类的差异化序列化需求,同时确保敏感数据安全。

蔡定努 335

@JsonView

@JsonView

底层码农 8619

CMU动作捕捉数据集实战:从AMC文件到Python可视化的完整流程

本文提供了CMU动作捕捉数据集的完整实战指南,详细解析了AMC文件格式,并对比了MATLAB转换、Python原生解析及转换为BVH格式三种数据解析策略。重点介绍了如何构建Python数据处理与可视化管道,包括将数据转换为Pandas DataFrame、绘制时间序列与相关性热力图,以及实现3D骨架动画,帮助开发者高效利用这一经典动作捕获数据集进行运动分析与模型训练。

android的专栏 716

@JsonView注解的简单使用

@JsonView注解的简单介绍以及简单使用

cV展示的学习园 2万+

centos7 python3.12.1 报错 No module named _ssl,坑我几个小时

网上的教程很多,但几乎是无效的,跟着我这教程,可以完美解决。

Amio_的博客 1万+

PyCharm 2023最新版安装配置全攻略(附永久激活教程)

本文详细介绍了PyCharm 2023最新版的安装配置全流程,包括版本选择、初始配置、插件生态、工程模板、调试优化及团队协作等关键步骤。特别针对专业版和社区版的功能差异进行对比,帮助开发者高效搭建Python开发环境,提升编码效率与团队协作能力。

p4q5r6s7t的博客 869

Spring Boot+原生注解@JsonView 轻松过滤字段,真的优雅!

实际的项目中,不可能只返回一个字段,如果返回多个字段,那就在C层再定一个接口,继承所以要返回字段的接口即可。注解指定返回的视图,就可以灵活控制返回的字段内容,实现了根据不同场景动态选择序列化字段的目的,大大提高了代码的简洁性和可维护性。的关系 因此,如果查询学生,班级会包含在学生的字段中,教师会包含在班级的字段中。对于已经定义JsowView的对象,C层只返回注解中的JsonView接口里面包含的字段,其他字段一概不返回。的所有字段,如果出现关联对象,只返回关联对象本身,而不返回其中的字段。

码猿技术专栏 335

量化策略缺数据?一份QMT/PTrade免费数据清单与特殊数据源QtFactor评测

本文为量化策略开发者提供QMT和PTrade平台的免费数据资源清单,并深度评测QtFactor在补充特色数据方面的价值。涵盖Tick级数据、Level2行情、资金流向等关键信息,帮助开发者在预算有限的情况下构建高效数据解决方案,特别适合打板策略和日内回转交易。

weixin_29058331的博客 416

JUnit 5面试精讲:从核心概念到Spring Boot整合实战

单元测试是保障软件质量、提升代码可维护性的基石,其核心在于通过隔离和自动化验证,确保每个代码单元按预期工作。JUnit作为Java领域事实上的单元测试标准框架,其原理是通过注解驱动测试生命周期,结合断言机制验证逻辑正确性。掌握JUnit能显著提升开发者的工程素养与问题排查能力,尤其在微服务与持续集成场景下,高质量的测试是快速迭代的重要保障。本文聚焦JUnit 5的模块化架构、生命周期管理、断言机制等核心概念,并深入探讨其与Mockito、Spring Boot测试框架的整合实践,通过解析@Mock、@Spy

weixin_30740581的博客 501

智能座舱芯片大乱斗:高通8155 vs 联发科MT8676 vs 华为麒麟990A,谁才是性价比之王?

本文深入对比了高通SA8155P、联发科MT8676与华为麒麟990A三款主流智能座舱芯片的性能、生态与成本。文章从CPU/GPU/NPU算力、开发生态、成本模型及典型应用场景出发,分析了各自在智能座舱领域的优势与适用性,为开发者与车企选型提供了实战参考,并探讨了智能座舱芯片未来的技术趋势。

yhn456789的博客 802

告别盲目调参:手把手教你用RKISP2.x Tuner理解AWB、AE、NR等核心模块

本文详细介绍了如何使用RKISP2.x Tuner工具进行ISP调试,重点解析AWB、AE、NR等核心模块的调参技巧。通过RV1126平台的实际操作演示,帮助工程师快速掌握可视化对比实验方法,告别盲目调参,提升图像信号处理效率。

weixin_30300225的博客 392

SpringBoot优雅地定制JSON响应数据

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

小杰不秃头的博客 1837

32、运算放大器的工作原理与应用

本文详细介绍了运算放大器的工作原理与多种应用场景,涵盖开环与闭环放大器的基本概念、理想运算放大器的特性及其‘黄金规则’。文章深入解析了反相放大器、同相放大器、单位增益跟随器与反相器的配置和增益计算,并探讨了电压比较器及窗口比较器的工作机制。同时提供了运算放大器在实际应用中的选型流程、使用注意事项以及常见故障排查方法,帮助读者全面掌握运算放大器的设计与应用要点。

u5v6w7的博客 163

关于@JsonView的使用心得及一些隐蔽的注意事项

关于@JsonView的使用心得 一、一般情况下的使用 1、声明View接口 在你想要声明多个视图的类中定义相应视图的view接口,视图之间可以继承,子视图会包含父视图的内容 2、在属性的get方法上指定视图 如果你想要某一个属性在某一种视图中出现,那么只需在对应属性的get方法上使用@JsonView注解声明其所在视图即可。本文在Notification类中声明三个视图,如下: public c...

weixin_42062369的博客 3084

【架构】-- StarRocks 和 Doris 介绍与选型建议

查询性能 | ✅ 高性能,支持向量化执行和 CBO 优化器 | ✅ 高性能,优化的查询引擎 |- **实时性要求高**:如果业务对数据的实时性要求较高,建议选择 **StarRocks**,其在实时数据处理和低延迟查询方面表现优越。- **复杂查询需求**:对于需要处理复杂多表关联查询的场景,两者均可胜任,需根据具体性能测试结果进行选择。

欢迎来到我的博客,一起探索代码里的世界! 1832

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

@JsonView的使用

https://www.cnblogs.com/yufeng218/p/11795652.html 1.使用场景 在某一些请求返回的JSON中,我们并不希望返回某些字段。而在另一些请求中需要返回某些字段。 例如: 在查询列表请求中,不返回password字段 在获取用户详情中,返回password字段 用户类 public class User { private Integer id; private String username; private S..

hellojoy的博客 879

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

使用@JsonView注解返回不同的JSON序列化数据

使用@JsonView,你能够灵活地控制Spring MVC中的JSON序列化过程,根据不同的视图返回不同的数据。这种方式尤其适合处理敏感信息或根据用户角色动态返回数据的场景。

nedma的博客 645

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Spring MVC中@JsonView的使用

一、@JsonView注解的简介 @JsonView是jackson json中的一个注解,Spring webmvc也支持这个注解,它的作用就是控制输入输出后的json 二、@JsonView注解的使用步骤 1.使用接口来声明多个视图 package com.knyel.dto; public class User { public interface UserS...

weixin_30756499的博客 229

@JsonView 简单介绍

jackson

偶尔记一下 - mybatis.io 3万+

深入解析 Jackson @JsonView:优雅控制 JSON 序列化

@JsonView视图控制

weixin_52238787的博客 1072

深入理解 Jackson 的 `@JsonView`:构建安全、灵活的 JSON API

Jackson 的 @JsonView 注解提供了一种类型安全的方式,通过视图机制控制 JSON 序列化/反序列化中的字段选择。开发者可以定义视图接口,将字段与特定视图关联,运行时激活相应视图即可获取不同的数据表现形式。相比动态过滤方案,@JsonView 具有编译期安全、语义清晰、支持继承等优势。在 Spring Boot 中可无缝集成,但需要注意集合返回类型的特殊处理方式(需使用 MappingJacksonValue 包装)。该机制特别适用于需要为不同场景提供差异化数据展示的 Web 服务场景

小李同学的博客 1200

@JsonView注解使用

@JsonView注解使用

zhk 139
上一篇: 不要再用千篇一律的 Windows 程序了,Windhawk 一键定制,爽到飞起!
下一篇: 企业级支付状态机设计与落地方案!
公众号-芋道源码
博客等级 码龄10年 1631粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值