jackson学习之六:常用类注解

本篇概览

  1. 本文是《jackson学习》系列的第六篇,继续学习jackson强大的注解能力,本篇学习的是常用的类注解,并通过实例来加深印象,下图是常用类注解的简介:

在这里插入图片描述

  1. 接下来逐个学习;

源码下载

  1. 如果您不想编码,可以在GitHub下载所有源码,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):

| 名称 | 链接 | 备注 |

| :-- | :-- | :-- |

| 项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |

| git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |

| git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |

  1. 这个git项目中有多个文件夹,本章的应用在jacksondemo文件夹下,如下图红框所示:

在这里插入图片描述

  1. jacksondemo是父子结构的工程,本篇的代码在annotation子工程中,里面的classannonation这个package下,如下图:

在这里插入图片描述

JsonRootName

  1. JsonRootName的设置如下:

@JsonRootName(value = “aaabbbccc”)

static class Test {

private String field0;

public String getField0() { return field0; }

public void setField0(String field0) { this.field0 = field0; }

}

  1. 开启root对象特性的代码以及序列化结果如下图,可见JsonRootName注解的value值aaabbbccc成了root对象的key:

在这里插入图片描述

  1. 开启root对象的反序列化特性后,用上述红框3中的json字符串可反序列化成Test类的实例;

  2. 关于root对象的序列化和反序列化特性,可以参考jackson学习之四:WRAP_ROOT_VALUE(root对象)

JsonIgnoreProperties

  1. 该注解用于指定序列化和反序列化时要忽略的字段,如下所示,Test类的field1和field2被设置为不参与序列化和反序列化操作:

@JsonIgnoreProperties({“field1”, “field2”})

static class Test {

private String field0;

private String field1;

private String field2;

// 省去get、set、toString方法

  1. 演示代码是JsonIgnorePropertiesSeriallization.java,执行结果如下图:

在这里插入图片描述

  1. 保持Test.java的JsonIgnoreProperties注解不变,再试试反序列化,对应的代码在JsonIgnorePropertiesDeserializer.java,如下图,反序列化后field1和field2依然是null,也就是说反序列化操作中,field1和field2都被忽略了:

在这里插入图片描述

JsonIgnoreType

  1. 被该注解修饰的类,作为其他类的成员变量时,不论是序列化还是反序列化都被忽略了;

  2. 来验证一下,如下所示,TestChild类被JsonIgnoreType注解修饰:

@JsonIgnoreType

static class TestChild {

private int value;

// 省去get、set、toString方法

  1. 如下所示,再把TestChild作为Test类的成员变量:

static class Test {

private String field0;

private TestChild field1;

// 省去get、set、toString方法

  1. 序列化操作的代码是JsonIgnoreTypeSerialization.java,执行结果如下图,可见类型为TestChild的field1字段,在序列化的时候被忽略了:

在这里插入图片描述

  1. 再来试试反序列化,代码在JsonIgnoreTypeDeserializer.java,如下图,可见带有注解JsonIgnoreType的类作为成员变量,在反序列化时会被忽略:

在这里插入图片描述

JsonAutoDetect

  1. 序列化和反序列化时自动识别的范围,如下:

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY)

public class College {

private String name;

private String city;

protected int age = 100;

  1. fieldVisibility属性有以下值可选:

ANY // 所有

NON_PRIVATE // private之外的

PROTECTED_AND_PUBLIC // protected和public的(此时privte和默认的package access时不能被自动识别的)

PUBLIC_ONLY // public的

NONE // 禁止自动识别

DEFAULT // 默认的,用于继承父类的自动识别的范围

  1. 验证,如下图,College类设置了注解,fieldVisibility是PUBLIC_ONLY,红框中显示age字段是protected类型的:

在这里插入图片描述

  1. 序列化结果如下图红框,age字段不是public,所以没有输出:

在这里插入图片描述

  1. fieldVisibility改成NON_PRIVATE再试试:

在这里插入图片描述

  1. 如下图红框,age不是private,所以可以被序列化:

在这里插入图片描述

JsonPropertyOrder

  1. 这个注解好理解,就是指定序列化的顺序,注意该注解仅在序列化场景有效;

  2. 先看看没有JsonPropertyOrder注解时的序列化顺序,Test.java如下所示,是和代码的顺序一致的:

static class Test {

private String field0;

private String field1;

private String field2;

// 省去get、set、toString方法

  1. 此时对Test的实例做序列化操作,结果如下图,顺序和代码顺序一致:

在这里插入图片描述

  1. 现在给Test类加上JsonPropertyOrder注解,顺序是field2、field0、field1:

@JsonPropertyOrder({“field2”, “field0”, “field1”})

static class Test {

private String field0;

private String field1;

private String field2;

// 省去get、set、toString方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值