jackson学习之六:常用类注解

简介: 熟悉和使用Jackson常用的类注解

欢迎访问我的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协议
  • 这个git项目中有多个文件夹,本章的应用在jacksondemo文件夹下,如下图红框所示:
    在这里插入图片描述
  • jacksondemo是父子结构的工程,本篇的代码在annotation子工程中,里面的classannonation这个package下,如下图:
    在这里插入图片描述

    JsonRootName

  • JsonRootName的设置如下:
@JsonRootName(value = "aaabbbccc")
static class Test {
   
   
  private String field0;
  public String getField0() {
   
    return field0; }
    public void setField0(String field0) {
   
    this.field0 = field0; }
}
  • 开启root对象特性的代码以及序列化结果如下图,可见JsonRootName注解的value值aaabbbccc成了root对象的key
    在这里插入图片描述
  • 开启root对象的反序列化特性后,用上述红框3中的json字符串可反序列化成Test类的实例;
  • 关于root对象的序列化和反序列化特性,可以参考jackson学习之四:WRAP_ROOT_VALUE(root对象)

    JsonIgnoreProperties

  • 该注解用于指定序列化和反序列化时要忽略的字段,如下所示,Test类的field1field2被设置为不参与序列化和反序列化操作:
    @JsonIgnoreProperties({
   
   "field1", "field2"})
    static class Test {
   
   
        private String field0;
        private String field1;
        private String field2;
        // 省去get、set、toString方法
  • 演示代码是JsonIgnorePropertiesSeriallization.java,执行结果如下图:
    在这里插入图片描述

  • 保持Test.javaJsonIgnoreProperties注解不变,再试试反序列化,对应的代码在JsonIgnorePropertiesDeserializer.java,如下图,反序列化后field1和field2依然是null,也就是说反序列化操作中,field1和field2都被忽略了
    在这里插入图片描述

    JsonIgnoreType

  • 被该注解修饰的类,作为其他类的成员变量时,不论是序列化还是反序列化都被忽略了;
  • 来验证一下,如下所示,TestChild类被JsonIgnoreType注解修饰:
    @JsonIgnoreType
    static class TestChild {
   
   
        private int value;
        // 省去get、set、toString方法
  • 如下所示,再把TestChild作为Test类的成员变量:
    static class Test {
   
   
        private String field0;
        private TestChild field1;
        // 省去get、set、toString方法
  • 序列化操作的代码是JsonIgnoreTypeSerialization.java,执行结果如下图,可见类型为TestChild的field1字段,在序列化的时候被忽略了
    在这里插入图片描述

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

    JsonAutoDetect

  • 序列化和反序列化时自动识别的范围,如下:
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY)
public class College {
   
   
    private String name;
    private String city;
    protected int age = 100;
  • fieldVisibility属性有以下值可选:
ANY // 所有
NON_PRIVATE // private之外的
PROTECTED_AND_PUBLIC // protected和public的(此时privte和默认的package access时不能被自动识别的)
PUBLIC_ONLY // public的
NONE // 禁止自动识别
DEFAULT // 默认的,用于继承父类的自动识别的范围
  • 验证,如下图,College类设置了注解,fieldVisibility是PUBLIC_ONLY,红框中显示age字段是protected类型的:
    在这里插入图片描述

  • 序列化结果如下图红框,age字段不是public,所以没有输出:
    在这里插入图片描述

  • fieldVisibility改成NON_PRIVATE再试试:
    在这里插入图片描述

  • 如下图红框,age不是private,所以可以被序列化:
    在这里插入图片描述

JsonPropertyOrder

  • 这个注解好理解,就是指定序列化的顺序,注意该注解仅在序列化场景有效
  • 先看看没有JsonPropertyOrder注解时的序列化顺序,Test.java如下所示,是和代码的顺序一致的:
    static class Test {
   
   
        private String field0;
        private String field1;
        private String field2;
        // 省去get、set、toString方法
  • 此时对Test的实例做序列化操作,结果如下图,顺序和代码顺序一致:
    在这里插入图片描述

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

    @JsonPropertyOrder({
   
   "field2", "field0", "field1"})
    static class Test {
   
   
        private String field0;
        private String field1;
        private String field2;
        // 省去get、set、toString方法
  • 执行结果如下图所示,也是field2、field0、field1:
    6.

    JsonInclude

    1. 注解JsonInclude仅在序列化场景有效;
    2. 通过该注解控制某些字段不被序列化(例如空字符串不被序列化);
    3. 可以设置以下几种限制:
ALWAYS // 默认策略,任何情况都执行序列化
NON_NULL // 非空
NON_ABSENT // null的不会序列化,但如果类型是AtomicReference,依然会被序列化
NON_EMPTY // null、集合数组等没有内容、空字符串等,都不会被序列化
NON_DEFAULT // 如果字段是默认值,就不会被序列化
CUSTOM // 此时要指定valueFilter属性,该属性对应一个类,用来自定义判断被JsonInclude修饰的字段是否序列化
USE_DEFAULTS // 当JsonInclude在类和属性上都有时,优先使用属性上的注解,此时如果在序列化的get方法上使用了JsonInclude,并设置为USE_DEFAULTS,就会使用类注解的设置
  • JsonInclude涉及的知识点较多,已在一篇单独文章中详细说明,请参考《jackson学习之五:JsonInclude注解》

  • 至此,Jackson的常用类注解的学习和实战就完成了,接下来的文章我们学习常用的属性注解;

欢迎关注阿里云开发者社区:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

相关文章
|
开发工具 git
git 对比两个commit 之间的差异
git 对比两个commit 之间的差异 比较两个版本之间的差异 git diff commit-id-1 commit-id-2 > d:/diff.txt 结果文件diff.txt中: "-"号开头的表示 commit-id-2 相对 commit-id-1 减少了的内容。
5504 0
|
JavaScript 前端开发 Android开发
Android 中WebView的使用详解
Android 中WebView的使用详解
2710 0
|
安全 关系型数据库 MySQL
MySQL的SSL/TLS支持是什么意思?具体如何使用?底层原理是什么?
MySQL的SSL/TLS支持是什么意思?具体如何使用?底层原理是什么?
1294 0
|
监控 Kubernetes Cloud Native
容器服务ACK结合MSE Ingress,让集群入口流量管理更丰富、更容易
作为Ingress Controller新选择MSE Ingress,我们始终立足用户视角,从用户真实业务场景出发,不断完善和优化Ingress使用体验,后续我们会持续在产品的性能、易用性、稳定性和生态方面持续打磨,以便用户无门槛的享受到云原生技术的红利。
容器服务ACK结合MSE Ingress,让集群入口流量管理更丰富、更容易
|
存储 关系型数据库 MySQL
面试官:谈谈 MySQL 联合索引生效、失效的条件?
这道题考查索引生效条件、失效条件。像这类问题才其实很有意义,建议各位以后面试其他伙伴的时候,多侧重这类问题的提问,比考察一般概念性的问题好多了。
面试官:谈谈 MySQL 联合索引生效、失效的条件?
|
存储 Android开发 图形学
Unity与Android Studio交互之 ✨ 获取手机权限(存储、录音、相机等)
Unity通过Android Studio 获取手机权限(存储、录音、相机等) 文章目录 Unity通过Android Studio 获取手机权限(存储、录音、相机等) 常用权限 一、动态获取权限流程 二、使用步骤 1.检测当前是否已获取权限 2.检测当前安卓版本 3.申请动态获取权限 总结
Unity与Android Studio交互之 ✨ 获取手机权限(存储、录音、相机等)
|
人工智能 大数据 知识图谱
浙江大学杨洋:社交网络中的群体用户行为分析与表示学习
摘要:在2018年1月6日的云栖社区数据智能技术论坛上,浙江大学计算机学院助理教授杨洋分享了以社交网络中的群体用户行为分析他们的行为特征,例如群体本身是怎样演化的,怎么用机器学习的方法把这个群体的用户和其他的用户区分出来,并列举四个经典案例。此外,他还对社交网络的表示学习进行了介绍。
5272 0
|
SQL 关系型数据库 MySQL
PHP实现MySQL并发查询
一般的,一个看似很简单的页面,一次http请求后,到达服务端,穿过Cache层,落到后台后,实际可能会有很多很多的数据查询逻辑!而这些查询实际是不相互依赖的,也即可以同时查询。比如各种用户信息,用户的APP列表,每个APP对应的流量数据、消耗记录、服务状态,平台运行状态,消息通知,新闻资讯等等。
1482 0