Jackson 各种注解使用示例

参考资料

  1. Jackson使い方メモ

目录

  • 一. @JsonIgnore
  • 二. @JsonIgnoreProperties
  • 三. @JsonProperty
    • 3.1 作用于entity属性上,指定json对象属性名
    • 3.2 作用于entity方法上,指定json对象属性名
  • 四. @JsonFormat
    • 4.1 日期格式化
    • 4.2 数字格式化
    • 4.3 枚举类返回code
  • 五. @JsonCreator注解 枚举类接收前台提交数据
    • 5.1 枚举类和接收数据entity的定义
    • 5.2 后台枚举类接收前台的数据
    • 5.3 后台枚举类型的数据返回给前台
  • 六. @JsonAlias
  • 七. @JsonInclude


一. @JsonIgnore

  • 在序列化和反序列化 JSON 数据时,忽略指定的属性。
import com.fasterxml.jackson.annotation.*;
import lombok.Data;@Data
public class Test34Entity {@JsonIgnoreprivate String id;private String name;private String content;
}
  • 返回数据给前台
@PostMapping("/get_data")
public ResponseEntity<Test34Entity> getData(@RequestBody Test34Entity data) {Test34Entity entity  = new Test34Entity();// 在此处设定了id属性entity.setId("1355930");entity.setName("贾飞天");entity.setContent("内容");return ResponseEntity.ok(entity);
}

⏹由于给id属性添加了@JsonIgnore注解,所以id并没有返回给前台。

在这里插入图片描述


二. @JsonIgnoreProperties

  • 同时指定多个需要忽略的属性
import com.fasterxml.jackson.annotation.*;
import lombok.Data;@Data
@JsonIgnoreProperties({"id", "content"})
public class Test34Entity {private String id;private String name;private String content;
}

⏹可以看到,因为id和content属性被忽略,所以只有name属性被返回到了前台。

在这里插入图片描述


三. @JsonProperty

3.1 作用于entity属性上,指定json对象属性名

⏹由下图可知,当前台json的属性值和后台实体类属性值不匹配时,可使用@JsonProperty指定

在这里插入图片描述

3.2 作用于entity方法上,指定json对象属性名

⏹部分属性值,后台需要根据既存的属性经过业务判断处理后返回前台,且该属性值最终只有前台需要,后台的业务逻辑中并不需要,此时可以将@JsonProperty注解作用于方法上,用来指定该属性

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;import java.util.Optional;@Data
public class Test34Entity {private String firstName;private String lastName;// 后台不需要该属性,只有前台才需要此属性// private String fullName;// 指定该方法的返回值作为json的属性,属性名为fullname@JsonProperty("fullName")private String getFullName() {return Optional.ofNullable(this.firstName).orElse("") + Optional.ofNullable(this.lastName).orElse("");}
}

⏹如下图所示,在返回给前台的时候,fullName也被返回。

在这里插入图片描述


四. @JsonFormat

4.1 日期格式化

  • 在Date和YearMonth属性上指定日期字符串的格式
import com.fasterxml.jackson.annotation.*;
import lombok.Data;import java.time.YearMonth;
import java.util.Date;@Data
public class Test34Entity {@JsonFormat(pattern = "yyyy/MM/dd")private Date birthday;@JsonFormat(pattern = "yyyy/MM")private YearMonth yearMonth;
}

⏹由下图可知,日期字符串转换为java实体类中的日期属性类型

在这里插入图片描述

4.2 数字格式化

  • 指定序列化时的数据类型(返回前台的数据类型)
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;import java.math.BigDecimal;@Data
public class Test34Entity {// 指定序列化时的数据类型是字符串@JsonFormat(shape = JsonFormat.Shape.STRING)private BigDecimal num1;@JsonFormat(shape = JsonFormat.Shape.STRING)private Integer num2;// 未指定序列化时的数据类型private BigDecimal num3;private Integer num4;
}

⏹可以看到,指定了 @JsonFormat(shape = JsonFormat.Shape.STRING)注解的属性,返回前台时的数据类型变为字符串类型。

在这里插入图片描述

4.3 枚举类返回code

详情请参考 5.3 后台枚举类型的数据返回给前台

五. @JsonCreator注解 枚举类接收前台提交数据

5.1 枚举类和接收数据entity的定义

⏹定义一个枚举类

  • Jackson根据@JsonCreator注解所作用的枚举类中的方法,将前台提交的数据转换为枚举类对象
  • fromName方法只是为了根据枚举类的name获取枚举类对象,和枚举类序列化反序列化没有关系
import com.fasterxml.jackson.annotation.JsonCreator;
import java.util.Arrays;public enum SexTypes {男性("1"),女性("2"),保密("3");private String code;SexTypes(String code) {this.code = code;}public String getCode() {return code;}/*根据code获取枚举类对象SpringBoot在将前台数据封装的时候,通过@JsonCreator注解对应的方法指定前台的性别code转换为对应的枚举类*/ @JsonCreatorpublic static SexTypes fromCode(String code) {return Arrays.stream(SexTypes.values()).filter(item -> item.code.equals(code)).findAny().orElse(null);}public static SexTypes fromName(String name) {return Arrays.stream(SexTypes.values()).filter(item -> item.name().equals(name)).findAny().orElse(null);}
}

⏹用来接收前台提交到后台数据的entity

import com.example.jmw.common.enums.SexTypes;
import lombok.Data;@Data
public class Test34Entity {private String id;// 自定义的枚举类private SexTypes sexTypes;
}

5.2 后台枚举类接收前台的数据

在这里插入图片描述

5.3 后台枚举类型的数据返回给前台

⏹在不做任何配置的情况下,默认返回前台的数据是枚举类的名称

在这里插入图片描述
⏹在枚举类上配置@JsonFormat(shape = JsonFormat.Shape.OBJECT),返回给前台的是枚举类的code

@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum SexTypes {男性("1"),女性("2"),保密("3");// ...以下代码省略...@JsonCreatorpublic static SexTypes fromCode(String code) {return Arrays.stream(SexTypes.values()).filter(item -> item.code.equals(code)).findAny().orElse(null);}
}

⏹效果如下所示,返回的是枚举类的code

在这里插入图片描述


六. @JsonAlias

  • 作用于实体类的属性上
  • 被标记的属性可以同时接受多个指定的key
import com.fasterxml.jackson.annotation.JsonAlias;
import lombok.Data;@Data
public class Test34Entity {// id 和 userId 都将被封装到此处@JsonAlias({"userId"})private String id;@JsonAlias({"userName"})private String name;
}

⏹效果如下所示,前台json中的key是userId,后台entity的属性值是id,但是通过@JsonAlias注解指定了别名userId,所以成功接受到数据。

在这里插入图片描述

七. @JsonInclude

  • JsonInclude.Include.NON_NULL:指定返回的数据中仅包含非null的数据
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Test34Entity {private String id;private String name;private String content;
}

⏹由下图可知,content属性为null,但是因为通过@JsonInclude(JsonInclude.Include.NON_NULL)的指定,所以值为null的属性压根就没有返回到前台。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录一次hss不能防护主机的问题

场景&#xff1a;hss的控制台显示不在防护中&#xff0c;其他云主机并没有这个情况。 故障发生的时间是昨天下午15点半左右&#xff0c;运维同事做了重启网卡的操作。service network restart 排查分析&#xff1a; 于是仔细的查看日志&#xff0c;发现报错如下&#xff1a…

MySQL-用户与权限管理:用户管理、权限管理、角色管理

用户与权限管理 用户与权限管理1.用户管理1.1 登录MySQL服务器1.2 创建用户1.3 修改用户1.4 删除用户1.5 设置当前用户密码1.6 修改其它用户密码 2. 权限管理2.1 权限列表2.2 授予权限的原则2.3 授予权限2.4 查看权限2.5 收回权限 访问控制连接核实阶段请求核实阶段 3. 角色管理…

iOS App Store审核要求与Flutter应用的兼容性分析

本文探讨了使用Flutter开发的iOS应用能否上架&#xff0c;以及上架的具体流程。苹果提供了App Store作为正式上架渠道&#xff0c;同时也有TestFlight供开发者进行内测。合规并通过审核后&#xff0c;Flutter应用可以顺利上架。但上架过程可能存在一些挑战&#xff0c;因此可能…

扫描IP开放端口该脚本用于对特定目标主机进行常见端口扫描(加载端口字典)或者指定端口扫描,判断目标主机开

扫描IP开放端口该脚本用于对特定目标主机进行常见端口扫描(加载端口字典)或者指定端口扫描,判断目标主机开 #/bin/bash #该脚本用于对特定目标主机进行常见端口扫描(加载端口字典)或者指定端口扫描,判断目标主机开放来哪些端口 #用telnet方式 IP$1 #IP119.254.3.28 #获得IP的前…

基于遗传优化的SVD水印嵌入提取算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于遗传优化的的SVD水印嵌入提取算法。对比遗传优化前后SVD水印提取性能&#xff0c;并分析不同干扰情况下水印提取效果。 2.测试软件版本以及运行结果展示 MA…

Set及其实现类与常用方法

1.Set及其常用实现类 Set接口是java.util.Collection接口的子接口.用来存储一个一个的数据.后面学习到的Map接口则用来存储key-value键值对. Set : 存储无序的,不可重复的数据|----->HashSet : 主要实现类 : 底层使用的是HashMap,即使用数组单向链表红黑树来存储。|-----&…

[C语言]——柔性数组

目录 一.柔性数组的特点 二.柔性数组的使用 三.柔性数组的优势 C99中&#xff0c;结构体中的最后⼀个元素允许是未知大小的数组&#xff0c;这就叫做『柔性数组』成员。 typedef struct st_type //typedef可以不写 { int i;int a[0];//柔性数组成员 }type_a; 有些编译器会…

机器学习模型——K—Means算法

目录 无监督学习概念&#xff1a; 有监督学习与无监督学习&#xff1a; 无监督学习 - 聚类分析 &#xff1a; 聚类算法应用场景&#xff1a; 常用聚类算法介绍&#xff1a; 对不同的聚类算法应用选择原则&#xff1a; 基于原型聚类&#xff1a; K-Means聚类算法概念及步…

访问网站时你的电脑都做了什么

电脑在访问百度时 首先在本地hosts文件里面查看本地有无域名对应的IP地址&#xff0c;若有就直接返回。若无&#xff0c;则本地DNS服务器当DNS的客户&#xff0c;向其它根域服务器发送报文查询IP地址&#xff0c;简单来说就是帮助主机查找IP&#xff0c;所以递归查询就在客户端…

秋招复习笔记——八股文部分:操作系统

笔试得刷算法题&#xff0c;那面试就离不开八股文&#xff0c;所以特地对着小林coding的图解八股文系列记一下笔记。 这一篇笔记是图解系统的内容。 硬件结构 CPU执行程序 计算机基本结构为 5 个部分&#xff0c;分别是运算器、控制器、存储器、输入设备、输出设备&#xf…

Go 实战|使用 Wails 构建轻量级的桌面应用:仿微信登录界面 Demo

概述 本文探讨 Wails 框架的使用&#xff0c;从搭建环境到开发&#xff0c;再到最终的构建打包&#xff0c;本项目源码 GitHub 地址&#xff1a;https://github.com/mazeyqian/go-run-wechat-demo 前言 Wails 是一个跨平台桌面应用开发框架&#xff0c;他允许开发者利用 Go …

5.网络编程-socker(golang版)

目录 一、什么是socket&#xff1f; 二、Golang中使用TCP TCP服务端 TCP客户端​​​​​​​ 三、TCP黏包&#xff0c;拆包 1.什么是粘包&#xff0c;拆包&#xff1f; 2.为什么UDP没有粘包&#xff0c;拆包&#xff1f; 3.粘包拆包发生场景 4.TCP黏包 黏包服务端 …

抖音变现项目有哪些?来这几个资源网站看看吧

做短视频就像是在做一道菜&#xff0c;你得有那么几个秘密武器&#xff0c;才能让你的作品从众多视频中脱颖而出。我这个视频剪辑界的“烹饪大师”&#xff0c;今天就来给大家分享一下我的厨房秘籍——那些让我视频大放异彩的素材网站。九才素材网&#xff1a; 说起九才素材网…

javaScript中原型链

一、原型链 js 的对象分为普通对象和函数对象。每个对象都有__proto__ 但是只有函数对象 (非箭头函数) 才有 prototype 属性。 new的过程&#xff1a; 1、创建一个空的简单 javaScript对象 2、将空对象的 __proto__连接到该函数的 prototype 3、将函数的this指向新创建的对象…

物联网网关

TopLink 是图扑物联专为针对工业物联网边缘侧应用场景打造的一款部署在本地近场环境、以高性能计算机为载体、与云端协同的一体化计算服务产品。具备工业协议解析、数据采集和转发、本地监控、本地场景联动等核心功能&#xff0c;具有跨平台、易使用等特点。 TopLink还默认适配…

小白水平理解面试经典题目1431. Kids With the Greatest Number of Candies【Array类】

个人专栏 &#x1f93a; leetcode &#x1f9d7; Leetcode Prime &#x1f3c7; Golang20天教程 &#x1f6b4;‍♂️ Java问题收集园地 &#x1f334; 成长感悟 欢迎大家观看&#xff0c;不执着于追求顶峰&#xff0c;只享受探索过程 1431. 拥有最多糖果的孩子 小白渣翻译 一…

qt样式表及qss文件的使用

三种设置样式表的方法&#xff1a; 1.使用ui文件&#xff0c;选中具体右键样式表输入即可 2.使用纯代码 mywidget::mywidget(QWidget *parent) : QWidget(parent) {this->setGeometry(100,100,500,500);this->setObjectName("mywidget");this->setStyleSh…

TypeScript系列之-理解TypeScript类型系统画图讲解

TypeScript的输入输出 如果我们把 Typescript 编译器看成一个黑盒的话。其输入则是使用 TypeScript 语法书写的文本或者文本集合。 输出是编译之后的 JS 文件 和 .d.ts 的声明文件 其中 JS 是将来需要运行的文件(里面是没有ts语法&#xff0c;有一个类型擦除的操作)&#xff0…

Python爬虫之分布式爬虫

分布式爬虫 1.详情介绍 分布式爬虫是指将一个爬虫任务分解成多个子任务&#xff0c;在多个机器上同时执行&#xff0c;从而加快数据的抓取速度和提高系统的可靠性和容错性的技术。 传统的爬虫是在单台机器上运行&#xff0c;一次只能处理一个URL&#xff0c;而分布式爬虫通过将…

【C++】用红黑树封装map和set

我们之前学的map和set在stl源码中都是用红黑树封装实现的&#xff0c;当然&#xff0c;我们也可以模拟来实现一下。在实现之前&#xff0c;我们也可以看一下stl源码是如何实现的。我们上篇博客写的红黑树里面只是一个pair对象&#xff0c;这对于set来说显然是不合适的&#xff…