java:jackson 四:Jackson Property Inclusion Annotations

news2025/1/11 22:46:30

java:jackson 四:Jackson Property Inclusion Annotations

1 前言

参考文档地址:

https://www.baeldung.com/jackson

https://www.baeldung.com/jackson-annotations

SpringBoot自带的jackson版本如下:

<parent>
    <artifactId>spring-boot-starter-parent</artifactId>
    <groupId>org.springframework.boot</groupId>
    <version>2.5.4</version>
</parent>

在这里插入图片描述

或者不使用SpringBoot情况下,单独配置jackson-databind版本:

<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <jackson-databind.version>2.14.1</jackson-databind.version>
</properties>
    
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson-databind.version}</version>
</dependency>

同时使用SpringBoot和自定义的jackson版本时,注意避免依赖冲突。

2 使用


2.1 @JsonIgnoreProperties

@JsonIgnoreProperties is a class-level annotation that marks a property or a list of properties that Jackson will ignore.

因此@JsonIgnoreProperties在类上使用时,可以忽略字段:

如下序列化时,必须有对应的Getter方法:

@JsonIgnoreProperties(value = {"id","value"})
@AllArgsConstructor
@Getter
class JacksonVO {
    int id;

    String fruitName;

    int age;

    String value;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    Date day;

    @Override
    public String toString(){
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }
}
JacksonVO jacksonVO = new JacksonVO(1,"apple", 22, "nihao", new Date());
System.out.println(jacksonVO);
System.out.println(objectMapper.writeValueAsString(jacksonVO));

执行结果:

JacksonVO[age=22,day=Thu Dec 29 16:40:49 CST 2022,fruitName=apple,id=1,value=nihao]
{
  "fruitName" : "apple",
  "age" : 22,
  "day" : "2022-12-29 16:40:49"
}

2.2 @JsonIgnore

In contrast, the @JsonIgnore annotation is used to mark a property to be ignored at the field level.

可见,@JsonIgnore使用于Field上的,如下:

@JsonIgnoreProperties(value = {"id","value"})
@AllArgsConstructor
@Getter
class JacksonVO {
    int id;

    String fruitName;

    @JsonIgnore
    int age;

    String value;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    Date day;

    @Override
    public String toString(){
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }
}
JacksonVO jacksonVO = new JacksonVO(1,"apple", 22, "nihao", new Date());
System.out.println(jacksonVO);
System.out.println(objectMapper.writeValueAsString(jacksonVO));

执行结果:

JacksonVO[age=22,day=Thu Dec 29 16:51:40 CST 2022,fruitName=apple,id=1,value=nihao]
{
  "fruitName" : "apple",
  "day" : "2022-12-29 16:51:40"
}

2.3 @JsonIgnoreType

@JsonIgnoreType marks all properties of an annotated type to be ignored.

We can use the annotation to mark all properties of type Name to be ignored:

@Getter
@Setter
@AllArgsConstructor
class JacksonVO1 {
    int id;
    JacksonVO2 vo2;

    @JsonIgnoreType
    @Getter
    @Setter
    @AllArgsConstructor
    static class JacksonVO2{
        int jid;
        String name;

        @Override
        public String toString(){
            return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
        }
    }

    @Override
    public String toString(){
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }
}
JacksonVO1 jacksonVO = new JacksonVO1(1,new JacksonVO1.JacksonVO2(123,"xiaoxu"));
System.out.println(jacksonVO);
System.out.println(objectMapper.writeValueAsString(jacksonVO));

执行结果:

JacksonVO1[id=1,vo2=JacksonVO1.JacksonVO2[jid=123,name=xiaoxu]]
{
  "id" : 1
}

2.4 @JsonInclude

We can use @JsonInclude to exclude properties with empty/null/default values.

Let’s look at an example excluding nulls from serialization:

@Getter
@JsonInclude(JsonInclude.Include.NON_NULL)
@AllArgsConstructor
class JacksonVO2 {
    int id;
    String name;
    Boolean flag;
    String value;

    @Override
    public String toString(){
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }
}
JacksonVO2 jacksonVO = new JacksonVO2(1, "xiaoxu", null, null);
System.out.println(jacksonVO);
System.out.println(objectMapper.writeValueAsString(jacksonVO));

执行结果:

JacksonVO2[flag=<null>,id=1,name=xiaoxu,value=<null>]
{
  "id" : 1,
  "name" : "xiaoxu"
}

@JsonInclude除了作用在类上,亦可作用在Field上:

修改DTO:

@Getter
@AllArgsConstructor
class JacksonVO2 {
    int id;
    String name;
    @JsonInclude(JsonInclude.Include.NON_NULL)
    Boolean flag;
    String value;

    @Override
    public String toString(){
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }
}

再次执行:

JacksonVO2[flag=<null>,id=1,name=xiaoxu,value=<null>]
{
  "id" : 1,
  "name" : "xiaoxu",
  "value" : null
}

2.5 @JsonAutoDetect

@JsonAutoDetect can override the default semantics of which properties are visible and which are not.

First, let’s take a look at how the annotation can be very helpful with a simple example; let’s enable serializing private properties.

DTO含有private字段:

@Getter
@AllArgsConstructor
@JsonAutoDetect
class JacksonVO3 {
    private int id;
    private String name;
    private Boolean flag;
    String value;

    @Override
    public String toString(){
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }
}
JacksonVO3 jacksonVO =new JacksonVO3(1, "xiaoxu", Boolean.TRUE, "value1");
System.out.println(jacksonVO);
System.out.println(objectMapper.writeValueAsString(jacksonVO));

执行结果:

JacksonVO3[flag=true,id=1,name=xiaoxu,value=value1]
{
  "id" : 1,
  "name" : "xiaoxu",
  "flag" : true,
  "value" : "value1"
}

2.6 @JsonFilter

The @JsonFilter annotation specifies a filter to use during serialization.

First, we define the entity and we point to the filter.

Now in the full test, we define the filter, which excludes all other properties except name from serialization.

如果需要根据场景自定义字段是否展示(比如A场景不展示这个字段,但是B场景需要展示这个字段,如果固定配置为@JsonIgnore,或者@JsonIgnoreProperties(value = {“id”,“value”}),反而不够灵活),此时可考虑@JsonFilter注解(自定义Filter,实现自定义序列化展示,根据场景选择是否需要使用该filter即可)

@Getter
@AllArgsConstructor
@JsonAutoDetect
@JsonFilter(value = "xiaoxuFilter")
class JacksonVO3 {
    private int id;
    private String name;
    private Boolean flag;
    String value;

    @Override
    public String toString(){
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }
}
/* 序列化时,仅保留 "id","name","flag" 三个字段  */
FilterProvider filter = new SimpleFilterProvider()
        .addFilter("xiaoxuFilter",
                SimpleBeanPropertyFilter.filterOutAllExcept("id","name","flag"));

JacksonVO3 jacksonVO = new JacksonVO3(1, "xiaoxu", Boolean.TRUE, "value1");
System.out.println(jacksonVO);
System.out.println(objectMapper.writer(filter).writeValueAsString(jacksonVO));

执行结果:

JacksonVO3[flag=true,id=1,name=xiaoxu,value=value1]
{
  "id" : 1,
  "name" : "xiaoxu",
  "flag" : true
}

使用另外的filter,更灵活:

/* 序列化时,仅保留 "id","name","flag" 三个字段  */
FilterProvider filter = new SimpleFilterProvider()
        .addFilter("xiaoxuFilter",
                SimpleBeanPropertyFilter.filterOutAllExcept("id","name","flag"));

/* 序列化时,除了"id","name"不展示,其余均展示 */
SimpleBeanPropertyFilter filter1 = SimpleBeanPropertyFilter
        .serializeAllExcept("id","name");
FilterProvider filter2 = new SimpleFilterProvider()
        .addFilter("xiaoxuFilter",filter1);

JacksonVO3 jacksonVO = new JacksonVO3(1, "xiaoxu", Boolean.TRUE, "value1");
System.out.println(jacksonVO);
System.out.println(objectMapper.writer(filter2).writeValueAsString(jacksonVO));

执行结果:

JacksonVO3[flag=true,id=1,name=xiaoxu,value=value1]
{
  "flag" : true,
  "value" : "value1"
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据可视化,21-30岁消费增速最快,年轻人正在成长为白酒消费的主力

2022中国白酒消费报告 中国酿酒的发源距今已经有四千多年的历史&#xff0c;中国有很多酒”酒乡”贵州的茅台、四川泸州的国窖、四川宜宾的五粮液。人们常说“把酒言欢”&#xff0c;这不马上就要过春节了&#xff0c;过节送礼、家庭聚会都非常适合&#xff0c;小编使用在线数据…

VSCode插件大全

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、必备插件1.Chinese&#xff08;中文&#xff09;2.Settings Sync&#xff08;配置同步到云端&#xff09;二、效率插件1.HTML Snippets&#xff08;代码提示&…

观察者模式(observer pattern) / 发布-订阅模式(Publish-Subscribe)

一个遍历问题导致的低效率范例 #include <iostream> #include <thread> #include <vector> #include <list> #include <mutex> #include <chrono> #include <algorithm> #include <set> #include <queue>using namespa…

一个三臂非劣效性检验的包简介——“ThreeArmedTrials”

目录0引言1.模型分类2. R语言函数介绍2.1 函数总览2.2 GElesions函数&#xff08;数据集1&#xff09;2.3 opt_alloc_RET函数2.4 power_RET函数2.5 remission&#xff08;数据集2&#xff09;2.6 seizures函数&#xff08;数据集3&#xff09;2.7 T2lesions函数&#xff08;数据…

多线程基础部分

多线程基础部分1. 线程与进程的关系1.1 多线程启动1.2 线程标识1.2.1 Thread与Runnable1.3 线程状态2.线程池入门2.1 ThreadPoolExecutor2.2 创建线程池2.3 关闭线程池创建线程的几种方法参考1. 线程与进程的关系 1个进程包含1个或多个线程。 1.1 多线程启动 线程有两种启动…

骨传导耳机是怎么传声的、骨传导耳机的优点是什么

要说这两年最火的蓝牙耳机是哪款&#xff0c;大火的骨传导耳机绝对可以名列前茅&#xff0c;那可真是运动健身、需长时佩戴耳机党的神器&#xff01;如果你是搞运动的、健身的&#xff0c;或者是需要长时间佩戴耳机上网课的学生党&#xff0c;那一副靠谱的骨传导耳机绝对是必不…

LVGL学习笔记7 - GD32平台优化

目录 1. 颜色深度 2. 更新disp_init 3. 更新disp_flush 4. 改为IPA更新数据 5. 死机问题 学习过程中发现GD32平台的显示效果不佳&#xff0c;而且会出现死机的问题&#xff0c;需要优化一下平台代码。 1. 颜色深度 修改颜色深度为32bit。 #define LV_COLOR_DEPTH 32 2.…

时序引擎架构和实例演练

一、时序引擎介绍 开务数据库时序引擎是一款功能丰富、高性能的时序引擎&#xff0c;专为物联网、工业互联网、数字能源、金融等场景设计并优化。它能让大量设备、数据采集器每天产生的高达 TB 甚至 PB 级的数据得到高效实时的处理&#xff0c;对业务的运行状态进行实时的监测、…

银行卡数据标签的列举与使用

银行卡三要素&#xff1a;银行卡号、姓名、身份证号&#xff0c;银行卡四要素是指银行卡号、姓名、身份证号、手机号。对于从事信贷风控的小伙伴来讲&#xff0c;并不陌生。 银行卡信息的应用可能更熟悉的是客户信息核验&#xff0c;也就是针对信贷客户审批额度发放之前&#x…

SpringCloud系列(七)最详细最全面详述统一网关 Gateway

有道词典上对 Gateway 有大门口, 门道, 通道以及计算机术语中的网关之意, 其实对于网关这个概念是很好理解的, 例如有这样高档的小区车库, 当开车经过闸口的时候会识别你的车牌号, 识别成功后会自动将你的车库门打开; 其实计算机中的网关也是如此, 在 Spring Cloud 中网关的实现…

【1 - 决策树 - 原理部分】菜菜sklearn机器学习

课程地址&#xff1a;《菜菜的机器学习sklearn课堂》_哔哩哔哩_bilibili 第一期&#xff1a;sklearn入门 & 决策树在sklearn中的实现第二期&#xff1a;随机森林在sklearn中的实现第三期&#xff1a;sklearn中的数据预处理和特征工程第四期&#xff1a;sklearn中的降维算法…

LOAM和SSL-SLAM

今天来水两个激光SLAM的相关框架的学习笔记。 一、LOAM 首先介绍scan-to-scan map-to-map scan-to-map之间的关系&#xff1a; 1.scan-to-scan匹配 即两帧激光雷达数据之间的匹配&#xff0c;目的是求得从起始帧A到目标帧B的相对平移量与旋转矩阵。目前来说scan-toscan中&a…

Elasticsearch搜索引擎

The Elastic Stack, 包括 Elasticsearch【搜索&#xff0c;分析】、 Kibana【可视化】、 Beats 和 Logstash【数据的搜集】&#xff08;也称为 ELK Stack&#xff09;。能够安全可靠地获取任何来源、任何格式的数据&#xff0c;然后实时地对数据进行搜索、分析和可视化。 Elati…

安装压缩包版mysql

一、mysql-8.0.21-winx64.zip解压 二、在解压后的目录下添加data目录 三、配置环境变量 win7&#xff1a; ​ 我的电脑–>属性–>高级系统设置–>高级–>环境变量 ​ 在下面系统变量中 ​ 新建 ​ 变量名&#xff1a;MYSQL_HOME ​ 变量值&#xff1a;E:\MySQL\my…

常用的接口安全性保障手段

http接口有哪些安全问题 数据被抓包窃取数据被恶意篡改数据被爬取泄漏Token授权机制 用户使用用户名密码登录后服务器给客户端返回一个Token&#xff08;通常是UUID&#xff09;&#xff0c;并将Token-UserId以键值对的形式存放在缓存服务器中。服务端接收到请求后进行Token验…

UG NX二次开发(C#)-曲线-NXOpen.Curve初探

系列文章目录 `` 例如:第一章 初探NXOpen.Curve类 文章目录 系列文章目录1.前言2.NXOpen.Curve2. NXOpen.Curve包含的子类3.曲线类型的获取4.将曲线对象转换为子类类型1.前言 介绍下NXOpen.Curve类、Curve类型的获取、一些创建曲线的封装方法(包括直线、样条曲线、圆锥曲线…

OSM数据内容解析

OSM数据内容解析 数据简介 OpenStreetMap&#xff08;简称OSM&#xff0c;中文是公开地图&#xff09;&#xff0c;这是一个网上地图协作计划&#xff0c;目标是创造一个内容自由且能让所有人编辑的世界地图。是一款由网络大众共同打造的免费开源、可编辑的地图服务。 OSM采…

成功实施APS生产排程系统,必须具备哪些条件?

在许多生产管理者眼中&#xff0c;生产作业计划是不重要的&#xff0c;如果我们只停留在小加工作坊的规模&#xff0c;大脑就能把一个月的订单、物料、资源记得清清楚楚&#xff0c;那么生产计划排程的必要性确实不太大&#xff0c;但事实上&#xff0c;随着生产规模的扩大&…

JDK1.8中HashMap的resize()方法详解

JDK1.8中HashMap的resize()方法详解 文章目录JDK1.8中HashMap的resize()方法详解[toc]一、概述二、源码解析三、元素迁移四、小结在学习本文之前&#xff0c;默认大家已经有了HashMap源码的前置知识。 「集合底层」深入浅出HashMap底层源码 一、概述 resize()方法的代码比较长…

OpenHarmony#深入浅出学习eTs#(四)登陆界面UI

本项目Gitee仓地址&#xff1a;深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com) 一、明确目标 经过前面两章的学习&#xff0c;大家对Super Visual应该有了一个较为简单的认识&#xff0c;这一章就把前面的知识点串一下&#xff0c;使用Ark UI(Super Visual)赖模仿一个Q…