当前位置: 首页 > news >正文

Spring Boot:SpringBoot 如何优雅地定制JSON响应数据返回

一、前言

  目前微服务项目中RESTful API已经是前后端对接数据格式的标配模式了,RESTful API是一种基于REST(Representational State Transfer,表述性状态转移)原则的应用程序编程接口(Application Programming Interface),它主要用于Web服务之间的数据交互。RESTful API的设计遵循一些核心原则,这些原则使得API更加简洁、灵活和可扩展。

  在构建这些API时,我们往往需要根据不同的客户端、用户角色或业务需求,灵活地控制返回的数据结构和内容。Jackson库的@JsonView注解为我们提供了一种优雅且高效的方式来实现这一目标。

二、问题场景

  @JsonView 是 Jackson 库中的一个注解,它允许你定义哪些属性应该被序列化到 JSON 中,基于不同的“视图”或“配置”。这在某些情况下非常有用,特别是当你想要为不同的用户或API端点返回不同级别的详细信息时。

  例如,你可能有一个User对象,其中包含多个属性,如id、name、email和password。当你为外部API或网站前端返回用户数据时,你可能不希望包含password字段。但是,在内部API或某些特定的情况下,你可能想要返回包含password的完整用户对象。

  这就是@JsonView可以帮助你的地方。你可以定义一个或多个“视图”类,并为你的属性指定应该出现在哪些视图中。

  在本文中,通过了解@JsonView,你将能够更好地掌握如何在Spring Boot应用中定制JSON数据的输出,从而提供更加灵活、安全且高效的RESTful API服务。

三、@JsonView主要应用场景

主要应用场景包括:

1.数据脱敏:在某些情况下,你可能不希望将数据库中的某些敏感信息(如密码、密钥等)暴露给客户端。通过使用 @JsonView,你可以定义哪些字段应该被包含在特定的视图中,并在返回数据时仅包含这些字段。

2.自定义数据输出:你可以根据客户端的需求或权限级别,定义不同的视图,并在返回数据时根据当前视图的配置来输出不同的字段组合。

四、代码实战

1. 定义实体类

package com.example.yddemo.JSONView;import com.fasterxml.jackson.annotation.JsonView;public class User {@JsonView(Views.Public.class)private Long id;@JsonView(Views.Public.class)private String name;@JsonView(Views.Internal.class)private String email;@JsonView(Views.Internal.class)private String password;public User(Long id, String name, String email, String password) {this.id = id;this.name = name;this.email = email;this.password = password;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", email='" + email + '\'' +", password='" + password + '\'' +'}';}
}

2. 定义视图控制器

public class Views {public static class Public { }public static class Internal extends Public { }
}

3. 在代码中使用,添加@JsonView注解

package com.example.yddemo.JSONView;import com.fasterxml.jackson.annotation.JsonView;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestDemoController {@GetMapping("/user/Public")@JsonView(Views.Public.class)public User userPublic() {User user = new User(1L, "Tom", "123123@163.com", "123456") ;return user  ;}@GetMapping("/user/Internal")@JsonView(Views.Internal.class)public User userInternal() {User user = new User(1L, "Tom", "123123@163.com", "123456") ;return user;}
}

输出结果
在这里插入图片描述

在这里插入图片描述
  不想使用在Controller接口上使用@JsonView注解方式,你还可以通过编程的方式控制,通过ObjectMapper类也能方便的控制json输出。

  @GetMapping("/user/all/public")public String userAllPublic() {ObjectMapper mapper = new ObjectMapper();User user = new User(1L, "Tom", "123123@163.com", "123456") ;String publicJson;try {publicJson = mapper.writerWithView(Views.Public.class).writeValueAsString(user);} catch (JsonProcessingException e) {throw new RuntimeException(e);}return publicJson;}@GetMapping("/user/all/internal")public String userAllInternal() {ObjectMapper mapper = new ObjectMapper();User user = new User(1L, "Tom", "123123@163.com", "123456") ;String internalJson;try {internalJson = mapper.writerWithView(Views.Internal.class).writeValueAsString(user);} catch (JsonProcessingException e) {throw new RuntimeException(e);}return internalJson;}

输出结果
在这里插入图片描述

在这里插入图片描述

通过@JsonView的代码展示思考一个问题?

  如果没有该注解你会通过什么方式实现?针对不同的场景定义不同的DTO?通过@JsonIgnore注解?

  定义不同的DTO太麻烦,代码大量冗余。使用@JsonIgnore注解所有的接口都将会忽略该字段,不能精准控制单个API接口。所以整体上看还是使用@JsonView更加的灵活。

四、总结

  @JsonView 与 @JsonIgnore 区别

  ①. @JsonView 用于控制序列化时的字段组合,允许你根据不同的视图返回不同的字段集合。
  ②. @JsonIgnore 则简单地忽略某个字段,使其在序列化时不会被包含在 JSON 中。

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

相关文章:

Spring Boot:SpringBoot 如何优雅地定制JSON响应数据返回

一、前言 目前微服务项目中RESTful API已经是前后端对接数据格式的标配模式了,RESTful API是一种基于REST(Representational State Transfer,表述性状态转移)原则的应用程序编程接口(Application Programming Interfac…...

c++中的constexpr 与decltype

constexpr constexpr 是 C11 引入的关键字,用于声明可以在编译时求值的常量表达式。constexpr 函数可以在编译时被计算,从而可以提高程序的性能并允许进行一些在运行时无法完成的优化。 在 C 中,constexpr 可以用于以下两种情况&#xff1a…...

苹果MacOS系统使用微软远程桌面连接Windows电脑桌面详细步骤

文章目录 前言1. 测试本地局域网内远程控制1.1 Windows打开远程桌面1.2 局域网远程控制windows 2. 测试Mac公网远程控制windows2.1 在windows电脑上安装cpolar2.2 Mac公网远程windows 3. 配置公网固定TCP地址 前言 日常工作生活中,有时候会涉及到不同设备不同操作系…...

【paper】基于分布式采样的多机器人编队导航信念传播模型预测控制

Distributed Sampling-Based Model Predictive Control via Belief Propagation for Multi-Robot Formation NavigationRAL 2024.4Chao Jiang 美国 University of Wyoming 预备知识 马尔可夫随机场(Markov Random Field, MRF) 马尔可夫随机场&#xff…...

代码随想录算法训练营第二天| 977.有序数组的平方 、209.长度最小的子数组、 59.螺旋矩阵II

977. 有序数组的平方 题目链接:977. 有序数组的平方 文档讲解:代码随想录 状态:so easy 刚开始看到题目第一反应就是平方之后进行排序,数据量在 1 0 4 10^4 104,可以使用O(nlogn)的排序。但是更好的方式是使用双指针&a…...

list stream 改变list属性的值

在Java中,如果你想使用Stream API来改变List中对象的某个属性值,需要注意的是,Stream API本身设计为不可变操作,即它不直接修改原有的集合,而是产生一个新的流或集合。但是,你可以通过流操作来创建一个新的…...

绿色智能:AI机器学习在环境保护中的深度应用与实践案例

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…...

Java高级面试精粹:问题与解答集锦(二)

Java面试问题及答案 1. 什么是Java内存模型(JMM)?它的作用是什么? 答案: Java内存模型(JMM)定义了Java虚拟机(JVM)在计算机内存中的工作方式,包括程序计数器…...

基于机器学习模型预测信用卡潜在用户(XGBoost、LightGBM和Random Forest)

基于机器学习模型预测信用卡潜在用户(XGBoost、LightGBM和Random Forest) 随着数据科学和机器学习的发展,越来越多的企业开始利用这些技术来提高运营效率。在这篇博客中,我将分享如何利用机器学习模型来预测信用卡的潜在客户。此…...

java 通过 microsoft graph 调用outlook(三)

这次会添加一个Reply接口&#xff0c; 并且使用6.10.0版本 直接上代码 一&#xff0c; POM <!-- office 365 --><dependency><groupId>com.microsoft.graph</groupId><artifactId>microsoft-graph</artifactId><version>6.1…...

QT--TCP网络通讯工具编写记录

QT–TCP网络通讯工具编写记录 文章目录 QT--TCP网络通讯工具编写记录前言演示如下&#xff1a;一、服务端项目文件&#xff1a;【1.1】server_tcp.h 服务端声明文件【1.2】thread_1.h 线程处理声明文件【1.3】main.cpp 执行源文件【1.4】server_tcp.cpp 服务端逻辑实现源文件【…...

如何解决爬虫的IP地址受限问题?

使用代理IP池、采用动态IP更换策略、设置合理的爬取时间间隔和模拟正常用户行为&#xff0c;是解决爬虫IP地址受限问题的主要策略。代理IP池是通过集合多个代理IP来分配爬虫任务&#xff0c;从而避免相同的IP地址对目标网站进行高频次访问&#xff0c;减少被目标网站封禁的风险…...

harmony 文件上传

图片上传 1&#xff0c; 获取文件&#xff0c;这里指的是图片 在鸿蒙内部有一个API pick选择器&#xff0c;实现文件保存和文件选择的功能&#xff0c; 使用pick对象创建PhotoViewPicker实例 传入必要的参数&#xff0c;如选择图片的数量&#xff0c;和弹出窗口的位置&#xf…...

什么是安全左移如何实现安全左移

文章目录 一、传统软件开发面临的安全挑战二、什么是安全左移四、安全左移与安全开发生命周期&#xff08;SDL&#xff09;三、安全左移对开发的挑战五、从DevOps到DevSecOps六、SDL与DevSecOps 一、传统软件开发面临的安全挑战 传统软件开发面临的安全挑战主要包括以下几个方…...

将PCD点云投影到BEV平面得到图片

前言 点云数据作为一种丰富的三维空间信息表达方式&#xff0c;通常用于自动驾驶、机器人导航和三维建模等领域。然而&#xff0c;点云数据的直观性不如二维图像&#xff0c;这限制了它在一些需要快速视觉反馈的应用场景中的使用。本文将探讨如何将点云数据转换为二维图像&…...

计算机笔记14(续20个)

230.色彩的种类就是色相 饱和度就是彩度除以明度 231.RISC是精简指令集&#xff0c;CISC是复杂指令集 232.世界上第一台数字计算机&#xff0c;奠定了至今仍在使用计算机体系结构 233.数据传输中&#xff0c;电路交换的传输延迟最小 234.定点整数的小数点约定在最低…...

docker 使用桥接网

在Docker中使用桥接网络&#xff0c;你可以创建一个新的桥接网络或者使用默认的桥接网络&#xff08;如果已经存在的话&#xff09;。以下是创建新桥接网络和连接容器到这个网络的示例命令&#xff1a; 1.创建一个新的桥接网络&#xff08;如果你想创建一个新的&#xff09;&a…...

1金融风控相关业务介绍

金融风控相关业务介绍 学习目标 知道常见信贷风险知道机器学习风控模型的优势知道信贷领域常用术语含义1 信贷&风控介绍 信贷业务,就是贷款业务,是商业银行和互联网金融公司最重要的资产业务和主要赢利手段 通过放款收回本金和利息,扣除成本后获得利润。贷款平台预测有…...

521源码-免费教程-经常用到的Vue.js的Vue@Cli入门指导

更多网站源码学习教程&#xff0c;请点击&#x1f449;-521源码-&#x1f448;获取最新资源&#xff1a;521源码-网站源码-资源素材-免费下载 Vue.js是一款流行的JavaScript框架&#xff0c;它使得构建交互式的Web界面变得简单和快捷。VueCli是Vue.js官方提供的脚手架工具&…...

大数据技术原理(二):搭建hadoop伪分布式集群这一篇就够了

&#xff08;实验一 搭建hadoop伪分布式&#xff09; -------------------------------------------------------------------------------------------------------------------------------- 一、实验目的 1.理解Hadoop伪分布式的安装过程 实验内容涉及Hadoop平台的搭建和…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...