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

智能推荐

hibernate 的dialect(方言)配置_hibernate.dialect配置-程序员宅基地

文章浏览阅读4.2k次。转自:https://blog.csdn.net/baidu_40487407/article/details/93042568RDBMS方言RDBMSDialectDB2org.hibernate.dialect.DB2DialectDB2 AS/400org.hibernate.dialect.DB2400DialectDB2 OS390org.hibern..._hibernate.dialect配置

Linux---wifi驱动移植及调试(SSV6x5x)_linux wifi驱动-程序员宅基地

文章浏览阅读4.4k次,点赞2次,收藏21次。南方硅谷ssv6x5x驱动移植_linux wifi驱动

Win10系统怎么使用U盘重装(图文并茂)_windows10下载u盘安装-程序员宅基地

文章浏览阅读6k次,点赞6次,收藏56次。本教程一共分为了10个步骤,每一个步骤都有图片,相对来说非常详细了,欢迎大家讨论与学习!_windows10下载u盘安装

MyEclipse中Maven设置jdk版本1.8_解决报错问题-程序员宅基地

文章浏览阅读3k次。今天安装了jdk1.8、tomcat8、和maven3.5.2,弄好后在myeclipse新建了一个maven项目,项目默认是jdk1.5,如图一,我把它改成jdk1.8,项目就报错了,如图二,然后update project后又变成jdk1.5了。图一:图二:解决方法:打开maven项目的pom.xml文件, 在build节点下加入下面这段代码 ,然后在选中项目右键--》maven4myecli..._myeclipse jdk没有1.8

html怎样让文字自动换行,CSS怎么设置文字自动换行?-程序员宅基地

文章浏览阅读3k次。CSS怎么设置文字自动换行?下面本篇文章就给大家介绍css设置文字(特别是连续的数字和英文)自动换行的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。关于换行问题,正常字符的换行是比较合理的,但连续的数字和英文字符常常将容器撑大,而不换行,就挺让人头疼了,这就需要进行强制自动换行了。示例:html代码:正常文字的换行(亚洲文字和非亚洲文字)元素拥有默认的white-space..._css 让文字根据html源码一样换行

个人联想Thinkpad X1 carbon 笔记本遇到的问题及解决办法_thinkpad x1carbon开机黑屏-程序员宅基地

文章浏览阅读214次。新买的一台联想Thinkpad X1 carbon 12代笔记本,不知道怎么搞的,突然有一天启动后会出现一段黑屏时间,然后等一段时间才会正常,非常地烦人。打电话给联想客服只提供了附近的维修地点,但那得花时间跑去啊。今天下午自己摸索终于解决问题了。没什么好办法,我开始卸载电脑上很多的软件,一是不想用了,二是想卸载的这些软件可能就是导致这个问题出现的原因,在卸载的时候看到电脑上的相关应用,但是在点开相机应用的时候竞然发现相机不能用了。怎么这么奇怪,我想到我以前确实是设置了一下相机的权限,难道是这个问题引起的。_thinkpad x1carbon开机黑屏

随便推点

高通平台8953 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇)_高通提取dtb-程序员宅基地

文章浏览阅读5.8k次,点赞3次,收藏61次。本系列导航:高通平台8953 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇)高通平台8953 Linux DTS(Device Tree Source)设备树详解之二(DTS设备树匹配过程)高通平台8953 Linux DTS(Device Tree Source)设备树详解之三(高通MSM8953 android7.1实例分析篇)一.什么是DTS?为..._高通提取dtb

ubuntu上opencv源码编译_libjasper-dev源码-程序员宅基地

文章浏览阅读301次。安装必备包sudo apt-get install build-essential cmake libjpeg-dev libtiff5-dev libjasper-dev安装gtkfor opencv3.2 and above:sudo apt-get install libgtk-3-devfor opencv2.4.x:sudo apt-get install libgtk2.0-dev安装v4l2sudo apt-get install v4l2ucp v4l-ut._libjasper-dev源码

安卓设备连接Unity Profiler进行性能分析_unity profile 手机-程序员宅基地

文章浏览阅读4.6k次,点赞2次,收藏7次。内容会持续更新,有错误的地方欢迎指正,谢谢!方式一:手机上运行游戏,以ADB方式连UnityProfiler分析游戏性能1.安卓环境:jdk、sdk:cmd(Win+R打开界面并输入cmd) 里直接输入 java 能正常输出即可 https://www.jianshu.com/p/21babde25dd5 adb:cmd 里直接输入 adb 能正常输出即可 https://www..._unity profile 手机

海思3559AV100实现8k文件编码_rk_mpi_cal_comm_getpicbuffersize-程序员宅基地

文章浏览阅读913次,点赞13次,收藏27次。有些小改动需要在common中改,都很简单就不写了,看一下就知道,另外我这边只测试了8k的一帧编码,如需连续编码视频需要再扩展一下,我这边由于公司项目安排就没再继续做了,测试出来8k文件编码的结果如下,颜色偏差是因为我的YUV和板子支持的YUV的存储顺序不一致,这里时间关系也就不调了,也算是顺利实现了芯片的8k文件编码。第二个函数是SAMPLE_VENC_CheckSensor,应该是检查镜头的分辨率支不支持要编的尺寸,这里我们先试的4k,所以也可以不管这个。_rk_mpi_cal_comm_getpicbuffersize

Android BLE 蓝牙通信库,2024年最新应届生面试销售岗位的面试问题技巧_android蓝牙通信-程序员宅基地

文章浏览阅读919次,点赞12次,收藏10次。然后根据自定义的协议,解析对应的 BeaconItem 中的 bytes,首先创建一个 BeaconParser,传入对应的 BeaconItem,然后根据协议不断读取数据, 如果协议中某个字段占 1 个字节,则调用 readByte,若占用两个字节则调用 readShort,如果要取某个字节的某个 bit 则调用 getBit。// 获取第 1 字节的第 1bit。可以在广播中携带设备的自定义数据,用于设备识别,数据广播,事件通知等,这样手机端无需连接设备就可以获取设备推送的数据。_android蓝牙通信

推荐文章

热门文章

相关标签