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;
    }

    @Override
    public 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 的数据定制化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/637722.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

光伏电站在线监测智能诊断系统:开启无人值守新纪元

光伏电站在线监测智能诊断系统:开启无人值守新纪元 大家都知道光伏电站是通过汲取着太阳的光芒,为人类提供源源不断的电能源。然而,随着光伏电站规模的扩大和复杂性的增加,如何有效提高发电效率、减少人工维护成本,实…

前端菜鸡,对于35+程序员失业这个事有点麻了

“经常看到30岁程序员失业的新闻,说实话,有点麻。目前程序员供求关系并未失衡,哪怕是最基础的前端或者后台、甚至事务型的岗位也是足够的。 事实上,现在一个开出的岗位要找到一位尽职尽责能顺利完成工作的程序员并不是一件那么容…

YOLOv8原理详解

Yolov8是2023年1月份开源的。与yolov5一样,支持目标检测、分类、分割任务。 Yolov8主要改进之处有以下几个方面: Backbone:依旧采用的CSP的思想,不过将Yolov5中的C3模块替换为C2F模块,进一步降低了参数量&#xff0c…

mysql实战——mysql5.7升级到mysql8.0

1、上传mysql8.0压缩包到/usr/local目录下 tar -zxvf mysql-8.0.25-linux-glibc2.12-x86_64.tar.xz mv mysql-8.0.25-linux-glibc2.12-x86_64 mysql8 #更改文件夹所属 chown -R mysql.mysql /usr/local/mysql8/ 2、更改配置文件my.cnf vi /etc/my.cnf # 最后几个for8.0的参数要…

Java输入与输出详解

Java输入和输出 前言一、Java打印Hello World二、输出到控制台基本语法代码示例格式化字符串 三、从键盘输入读入一个字符正确写法 使用 Scanner 读取字符串/整数/浮点数使用 Scanner 循环读取 N 个数字 前言 推荐一个网站给想要了解或者学习人工智能知识的读者,这…

tomcat jdbc连接池的默认配置

MySQL 5.0 以后针对超长时间数据库连接做了一个处理,即一个数据库连接在无任何操作情况下过了 8 个小时后(MySQL 服务器默认的超时时间是 8 小时),MySQL 会自动把这个连接关闭。在数据库连接池中的 connections 如果空闲超过 8 小时,MySQL 将…

详解 UML 中的关系概念

关联(Association) 表示两个类之间的一种语义性联系。例如: 学生与班级之间的关联关系。 有向关联(Directed Association) 关联关系有方向性,表示一个类能访问另一个类,但不一定反过来。例如: 教师能查看学生的成绩,但学生不能查…

PMapper:助你在AWS中实现IAM权限快速安全评估

关于PMapper PMapper是一款功能强大的脚本工具,该工具本质上是一个基于Python开发的脚本/代码库,可以帮助广大研究人员识别一个AWS账号或AWS组织中存在安全风险的IAM配置,并对IAM权限执行快速评估。 PMapper可以将目标AWS帐户中的不同IAM用户…

C++入门:从C语言到C++的过渡(1)

目录 1.什么是C 2.C的标准库 3.命名空间 3.1为什么要存在命名空间 3.2命名空间的定义 3.3命名空间的使用 3.3.1域作用限定符 3.3.2using关键字引入某个成员 3.3.3using关键字引入命名空间名称 3.4命名空间的嵌套 3.5命名空间的合并 4.C中的输入与输出 1.什么是C C&am…

BatBot智慧能源管理平台,更加有效地管理能源

随着能源消耗的不断增加,能源管理已成为全球面临的重要问题。BatBot智慧能源管理作为一种的能源管理技术,促进企业在用能效率及管理有着巨大的提升。 BatBot智慧能源管理是一种基于人工智能技术的能源管理系统,通过智能分析和优化能源使用&…

7. 3 层神经网络的实现和输出层的激活函数

目录 1. 3 层神经网络的实现 1.1 输入层数据到 1 层神经元 1.2 1 层神经元到 2 层神经元 1.3 2 层神经元到输出层神经元 2. 输出层的激活函数 2.1 恒等函数 2.2 softmax 函数 2.2.1 softmax 函数表达式 2.2.2 softmax 代码实现 2.2.3 softmax 的改进 2.2.3 softmax 函…

Mixiy(米思齐)安装

Mixiy(米思齐)安装 官网地址:爱上米思齐 打开官网,选择下图的软件进行下载 复制提取码,点击链接跳转到网盘进行下载,选择(RC4完整版) 下载完成后,解压到合适的位置,进入文件夹,双击Mixly.exe即…

Spark SQL【Java API】

前言 之前对 Spark SQL 的影响一直停留在 DSL 语法上面,感觉可以用 SQL 表达的,没有必要用 Java/Scala 去写,但是面试一段时间后,发现不少公司还是在用 SparkSQL 的,京东也在使用 Spark On Hive 而不是我以为的 Hive O…

C++数据结构——哈希表

前言:本篇文章将继续进行C数据结构的讲解——哈希表。 目录 一.哈希表概念 二.哈希函数 1.除留取余法 三.哈希冲突 1.闭散列 线性探测 (1)插入 (2)删除 2. 开散列 开散列概念 四.闭散列哈希表 1.基本框架 …

一.ffmpeg 将内存中的H264跟PCM 数据流合成多媒体文件

在有一些嵌入式平台中,H264数据流一般来自芯片内部的硬编码器, AAC音频数据则是通过采集PCM进行软编码,但是如何对它实时进行封装多媒体文件 ,参考ffmpeg example,花了一些时间终于实现了该功能。 流程图如下&#xf…

es问题汇总--待完善

1. 查询某个索引库中数据总量 方式一: CountRequest 鄙人喜欢这种方式 public long getTotalNum(String indexName) throws IOException {CountRequest countRequest new CountRequest(indexName);// 如果需要,你可以在这里添加查询条件// countReques…

内脏油脂是什么?如何减掉?

真想减的人,减胖是很容易的,但想要形体美又健康,还是得从减内脏油脂开始,那么,问题来了,什么是内脏油脂? 油脂它分部于身体的各个角落,四肢、腹部、腰、臀部、脸、脖子...等&#xf…

暴雨信息液冷计算解决方案亮相CCIG 2024

5月24日,2024中国图象图形大会(CCIG)在陕西西安正式开幕。作为涵盖图像图形各专业领域的综合性的全国性学术会议,CCIG面向开放创新、交叉融合的发展趋势,为图像图形相关领域的专家学者和产业界的同仁,搭建了…

深入用户内心:设计师如何通过可用性测试洞察用户需求

可用性测试是指让用户体验产品的原型或成品。设计师通过观察和分析用户的使用行为和感受,进一步合理地改进产品的设计方法。你可能会想知道我们可以用什么方法来测试可用性?随着互联网行业的快速迭代更新,可用性测试衍生出了许多类型和方法。…

【C++初阶】—— 类和对象 (下)

📝个人主页🌹:EterNity_TiMe_ ⏩收录专栏⏪:C “ 登神长阶 ” 🌹🌹期待您的关注 🌹🌹 类和对象 1. 运算符重载运算符重载赋值运算符重载前置和后置重载 2. 成员函数的补充3. 初始化列…