Json常用注解_jsonignore注解-程序员宅基地

技术标签: java  json  数据库  

1、@JsonIgnoreProperties
类别:类注解
作用:json序列化时将bean中的一些属性忽略掉,序列化和反序列化都受影响
内部可以写多个属性

@JsonIgnoreProperties({
    "name"},{
    "age"})

allowGetters,allowSetters一起用用来控制字段忽视是在序列化还是反序列化
allowGetters=true:字段允许序列化,反序列的时候忽略该字段
allowSetters=true:字段允许反序列化,序列化的时候忽略该字段
ignoreUnknown=true:反序列化的时候忽视未知的字段,解决字段无法对应实体类会报错json解析异常

2、@JsonIgnore
类别:属性或方法上的注解(最好是属性上)
作用:用来完全忽略被注解的字段和方法对应的属性,序列化和反序列化都受影响

@JsonIgnore
private int age;
标记注释,指示基于内省的序列化和反序列化功能将忽略带注解的方法或字段。也就是说,它不应该被认为是“getter”、“setter”或“creator”(it should not be consider a "getter", "setter" or "creator".)

如果一个“getter”方法表示要序列化的属性(比如说,“getValue”表示要序列化的属性“value”),则该方法将被忽略,除非另一个注释定义了要使用的替代方法,否则不会输出此类属性。

此注释仅在方法对方法(或字段对字段)的基础上工作;一个方法或字段上的注释并不意味着忽略其他方法或字段。具体地说,标记“setter”候选者不会改变匹配“getter”方法的处理(反之亦然)。

没有显式定义“value”参数(默认为true):但参数可以显式定义。可以通过使用“false”参数明确定义一个JsonIgnore来覆盖现有JsonIgnore。
注释类似于javax.xml.bind.Annotation.XmlTransient

3、@JsonFormat
类别:用于属性或方法上(最好是属性上)
在需要查询出来的时间的数据库字段对应的实体类的属性上添加

@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")

pattern: 需要转换的时间日期的格式
timezone:将时间设置为东八区,避免时间在转换中有误差

可以在属性对应的get方法上,两种方式没有区别

4、@JsonSerialize
用于属性或getter方法,在序列化时嵌入自定义代码

需要使用 using 属性指定处理参数的类,该类需要继承 JsonSerializer 类,并重写 serialize()。
若使用了 Lombok 需要自己定义相应的 get 方法。

以将日期格式化为yy-mm-dd为例。

@JsonSerialize(using = CustomDateSerialize.class)
public Date getDate() {
    return date;
}
/**
 * @author orchid
 * @date 2021-08-03 14:14
 * @description 日期序列化工具, 直接将时间类型的转为yyyy-MM-dd类型的数据
 */
public class CustomDateSerialize extends JsonSerializer<Date> {
    

    // 定义日期格式
    private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
    
        jsonGenerator.writeString(simpleDateFormat.format(date));
    }
}

5、@JsonDeserialize

用于属性或者setter方法上,用于在反序列化时可以嵌入我们自定义的代码,类似于上面的@JsonSerialize

需要使用 using 属性指定处理参数的类,该类需要继承 JsonSerializer 类,并重写 serialize()。
若使用了 Lombok 需要自己定义相应的 get 方法。

在前端性别显示“男 / 女”;数据库中存储的是“1 / 0”,对应的 Pojo 也是使用的 Integer 类型

@Data
public class Person implements Serializable {
    
    private static final long serialVersionUID = 4346092911489022673L;
    
    /**
     * 1 男,0 女
     */
    private Integer gender;

    @JsonDeserialize(using = GenderJsonDeserializer.class)
    public void setGender(Integer gender) {
    
        this.gender = gender;
    }

    @JsonSerialize(using = GenderJsonSerializer.class)
    public Integer getGender() {
    
        return gender;
    }
}

JsonDeserializer 作用是:处理参数,按照规则封装到指定的属性中
通过 jsonParser.getText() 获取参数

/**
 * @author orchid
 * @date 2021-08-03 14:43
 * @description
 */
public class GenderJsonDeserializer extends JsonDeserializer {
    
    @Override
    public Object deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
    
        if (ObjectUtils.isEmpty(jsonParser)) {
    
            return null;
        }
        int gender = 0;
        switch (jsonParser.getText()) {
     // 通过getText获取参数
            case "男":
                gender = 1;
                break;
            case "女":
                break;
            default:
                throw new RuntimeException("传入的性别为非法字符");
        }

        return gender;
    }
}

JsonSerializer 作用是:处理属性,按照规则封装到指定的参数中,通过value获取属性
通过 jsonGenerator.writeXxx() 写出参数

/**
 * @author orchid
 * @date 2021-08-03 14:43
 * @description
 */
public class GenderJsonSerializer extends JsonSerializer {
    
    @Override
    public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
    
        if (o.equals(1)) {
    
            jsonGenerator.writeString("男"); // 写出参数
        } else if (o.equals(0)) {
    
            jsonGenerator.writeString("女"); // 写出参数
        }
    }
}

6、@Transient
属性不与数据库表的字段映射——该字段在数据库中不存在,而需要使用。标示为@Transient
该属性不存储到数据库,不修改已存在数据库中数据的数据结构

//表示该字段在数据库表中不存在
@Transient
public int getAge() {
 return 1+1;
}

7、@JsonIgnoreType
类别:类注解
作用:类在序列化和反序列化的时候被忽略

8、@JsonProperty
作用:指定某个属性和json映射的名称

1.前端传过来的参数,想用其他属性名接收,可以在属性上加此注解
2.后端返回给前端数据时,前端要求指定key,可在属性上加此注解,就会以注解中的value返回
@JsonProperty是@JsonGetter与@JsonSetter的合体版

public class User {
    
    @JsonProperty("user_name")
    private String userName;
}

返回的json

{
    “user_name”:”xxx”}

只在序列化情况下生效的注解

1、@JsonPropertyOrder

在将 java pojo 对象序列化成为 json 字符串时,使用 @JsonPropertyOrder 可以指定属性在 json 字符串中的顺序。

2、@JsonInclude

在将 java pojo 对象序列化成为 json 字符串时,使用 @JsonInclude 注解可以控制在哪些情况下才将被注解的属性转换成 json

ALWAYS :默认策略,任何情况下都序列化该字段
NON_NULL:注解的字段为null不序列化
NON_ABSENT:注解的字段为null的时候不序列化

This option is mostly used to work with "Optional"s (Java 8, Guava)

NON_EMPTY :注解的字段为null或为空不序列化
NON_DEFAULT:字段是默认值的话就不序列化
CUSTOM:自定义排除序列化规则

过滤器对象的 equals() 方法被调用并带有要序列化的值;  如果返回真值则排除(即过滤掉);

USE_DEFAULTS:

伪值用于指示更高级别的默认值是有意义的,以避免覆盖包含值。  例如,如果返回一个属性,这将使用包含属性的类的默认值,如果有的话;  如果没有为此定义,则全局序列化包含详细信息。

4、@JsonGetter

反序列化时指定字段名

@JsonGetter("username")
public String getName() {
    
	return name;
}

@JsonAnySetter

反序列化时实体对象不存在对应的属性时加上该 注解,不存在的属性都会放到Map中去

@Data
public class People {
    

    private String username;
    private Map<String, String> properties;

    @JsonAnyGetter
    public Map<String, String> getProperties() {
    
        return properties;
    }
}


在反序列化情况下生效的注解

1、@JsonSetter

@JsonSetter 标注于 setter 方法上,类似 @JsonProperty ,也可以解决 json 键名称和 java pojo 字段名称不匹配的问题。

前端传过来json转换为java对象时,json的key与实体类的属性不一致 ,用@JsonSetter注解做转换

@JsonSetter("userId")
public void settId(String id) {
    
	this.id = id;
}

2、@JsonAnyGetter

序列化时Map加上该属性可以将map中的属性序列化为指定字符串

@Data
public class People {
    

    private String username;
    private Map<String, String> properties;
    
    @JsonAnySetter
    public void setProperties(Map<String, String> properties) {
    
        this.properties = properties;
    }
}

参考:
https://www.cnblogs.com/wdss/p/11832315.html
https://blog.csdn.net/weixin_44130081/article/details/89671016
https://blog.csdn.net/yage124/article/details/107321339/
https://www.cnblogs.com/mracale/p/9828346.html
https://blog.csdn.net/qq_29645505/article/details/89007323
https://blog.csdn.net/weixin_44130081/article/details/89678450
https://blog.csdn.net/reee112/article/details/83345629
https://blog.csdn.net/yaomingyang/article/details/106069715

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_58803607/article/details/119343120

智能推荐

ESP8266和ESP32区别,以及优缺点分析!_esp8266为什么不建议使用-程序员宅基地

文章浏览阅读3.4k次,点赞3次,收藏4次。高速主频240MHZ,对比STM32F1的72MHZ和STM32F4的168MHZ,速度快很多,而且价格上比起一直在涨价的STM系低出非常多;总的来说,STM32在国内的使用程度和受众程度是远大于ESP32的,毕竟STM32已经占据主流市场很久了,学习的资料比起ESP32起来会多,再加上一些开源问题,使用32的人群还是占据多数。2016年,乐鑫推出了ESP32,它是ESP8266的升级版本,速度更快还带有蓝牙4.2和蓝牙低功耗,价格在20元左右,在这个价格下几乎找不到对手可以“一战”。_esp8266为什么不建议使用

linux 分区简介,Linux硬盘分区知识简介-程序员宅基地

文章浏览阅读990次。Linux系统可以挂载多个不同接口类型的磁盘(disk),每一个磁盘又可以分成若干个分区(Partition),每个分区又可以拥有自己的文件系统类型(FileSystem)。Linux对于磁盘和分区又自己的一套标记方法。硬盘和分区的区分第一个SCSI(Small Computer System Interface)磁盘记为/dev/sda,第二个SCSI磁盘记为/dev/sdb;第一个SATA磁盘..._linux引导分区的标记可为

unity 网络游戏架构设计(第12课:网络游戏案例讲解)之美_网络游戏消息结构设计案例-程序员宅基地

文章浏览阅读656次。第12课:网络游戏案例讲解上章给读者介绍关于服务器之间的通信,本章通过案例给读者介绍如何将框架跟 Photon 结合起来,实现一个网络通信的框架设计。UI 架构设计模块已经介绍过,我们的 Demo 使用的 UI 是 UGUI,简单的用几个 Button 代替 Sprite,它们的原理是一样的。我们先创建一个 UI,如下图所示:这个 UI 主要有三个关键按钮,分别是 Create Roo..._网络游戏消息结构设计案例

Android-Gradle详解_grade编译运行安卓-程序员宅基地

文章浏览阅读548次。Android 构建系统非常灵活,可让你在不修改应用核心源代码文件的情况下执行自定义构建配置。本部分将介绍 Android 构建系统的工作原理,以及它如何帮助你对多个构建配置进行自定义和自动化处理。构建过程涉及许多将你的项目转换为 Android 应用程序包 (APK) 的工具和过程。构建过程非常灵活,因此了解一些幕后发生的事情很有用。下图为Android 应用模块的构建过程。Android 应用模块的构建过程(如上图所示)遵循以下一般步骤:1、编译器将你的源代码转换为 DEX(Dalv_grade编译运行安卓

linux网络配置后面加一条wheel,linux安全配置/etc/sudoers&wheel组-程序员宅基地

文章浏览阅读800次。/etc/sudoers 控制哪些用户能在哪些主机上以哪些用户的身份执行哪些命令。只有此文件权限为440时才能用户才能使用sudo命令,只有root用户才能使用visudo命令修改此文件。当然也可以先添加文件写权限,然后修改,再把文件权限改回来。此文件的一些配置规则定义别名:User_Alias UserName = user1,user2,kongoveHost_Alias HostName =..._%wheel all=(all) all

NO.15——使用Appium自动化测试爬取微信朋友圈数据_appium监测微信图片-程序员宅基地

文章浏览阅读9.7k次,点赞5次,收藏27次。 一、解析过程本人使用锤子手机做测试,型号是YQ601,首先打开开发者模式确保手机能与mac相连,打开Appium客户端,配置参数如图可以理解为Appuim继承自web端的selenium,同样可以执行一些自动化操作。Appium自带了一个XPATH选择器,给用户提供了选择结果,如图这个选择器给出的结果太繁琐,所以可以改成通过查找ID的方式来构造爬虫程序。但是这里要注意,估计微信提升了自己..._appium监测微信图片

随便推点

交叉编译工具 aarch64-linux-gnu-gcc 的介绍与安装-程序员宅基地

文章浏览阅读8w次,点赞20次,收藏160次。aarch64-linux-gnu-gcc 是由 Linaro 公司基于 GCC 推出的的 ARM 交叉编译工具_aarch64-linux-gnu-gcc

数码管扫描显示verilog_如何开始Xilinx FPGA开发之旅 第二课 EGO1数码管与键盘-程序员宅基地

文章浏览阅读1.4k次。庚子年,我们的EGO1在疫情当中作为口袋实验平台成为了众多高校的复课利器。其中的成功案例更是得到了新华社网媒与CCTV教育频道的报道。借此东风,为了让更多的老师与学生熟悉了解Xilinx,更好的入门学习FPGA知识,我们的师资培训直播已开设EGO1专题直播,欢迎新老朋友跟踪关注。第二课---- EGO1数码管与键盘本周的直播我们将介绍EGO1的外设使用案例,介绍数码管扫描的原理和PS/2..._fpgaego1 键盘

python re库安装_python 库安装方法及常用库-程序员宅基地

文章浏览阅读3.6k次。python库安装方法:方法一:setpu.py1.下载库压缩包,解压,记录下路径:*:/**/……/2.运行cmd,切换到*:/**/……/目录下3.运行setup.py build4.然后输入python,进入python模块,验证是否安装成功方法二:1.Win + R 打开运行窗口,输入cmd回车2.找到pip安装路径——x:\Python xx\Scripts3. 在命令行中切换至该目录c..._rep库怎么安装

android listview fling,ListView优化: Fling(松开滑动) 过程中不加载数据-程序员宅基地

文章浏览阅读189次。1.Adapter增加滑动结束以后刷新方法//定义当前listview是否在滑动状态private boolean isScrolling = false;public void setScrolling(boolean scrolling) {this.isScrolling = scrolling;}public void refreshOnScrollEnd(AdapterView list..._android listview fling

微信公众号JSAPI自费支付总结_微信自动续费api-程序员宅基地

文章浏览阅读535次。文章目录前言一、准备操作1.公众号ID2.商户号3.商户号密钥4.域名、服务器二、步入正题1. 支付流程2. 初始化订单数据2.读入数据总结前言本编章主要是通过运行一个自费测试demo使其能够快速了解微信自费支付的实现流程,也是个人实现微信自费demo之后的记录、总结官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1一、准备操作进行微信自费支付之前请先获得以下几项必要条件,公众号和商户号需要绑定名称_微信自动续费api

java byte 字节负数-程序员宅基地

文章浏览阅读2w次。由于通讯协议中长度使用byte字节来表示,但在java中长度超过127的时候会变成负数,所以需要保证得到的长度是正数byte b & 0xFFhttp://www.blogjava.net/orangelizq/archive/2008/07/20/216228.html在剖析该问题前请看如下代码public static String bytes2HexString(

推荐文章

热门文章

相关标签