211025-Gson之序列化指定忽略字段的写法

在我们日常使用json序列化框架过程中,经常会遇到在输出json字符串时,忽略某些字段,那么在Gson框架中,要想实现这种方式,可以怎么处理呢?

本文介绍几种常见的姿势

1. transient关键字

最容易想到的case,就是直接借助jdk的transient关键字来修饰不希望输出的对象,如

1
2
3
4
5
6
7
8
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class GItem {
private String user;
// @IgnoreField
private transient String pwd;
}

上面的对象中,pwd前面使用transient进行修饰,那么在输出json串时,默认会忽略

1
2
3
4
5
6
@Test
public void testPrint() {
GItem item = new GItem("一灰灰", "yihui");
String ans = new Gson().toJson(item);
System.out.println(ans);
}

输出如

1
{"user":"一灰灰"}

2. expose注解

借助gson提供的expose注解,也可以实现上面的case,如在需要保留的字段上添加@Expose

1
2
3
4
5
6
7
8
9
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class GItem {
@Expose
private String user;
// @IgnoreField
private String pwd;
}

然后我们使用的地方,注意通过 GsonBuilder来创建Gson对象

1
2
3
4
5
6
@Test
public void testPrint() {
GItem item = new GItem("一灰灰", "yihui");
String ans = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(item);
System.out.println(ans);
}

上面这种使用姿势感觉有点怪怪的,在需要保留的字段上添加注解,这种使用方式并没有jackson的@JsonIgnore方式来得方便

3. 自定义排查策略ExclusionStrategy

除了上面两种方式之外,通过自定义的排除策略可以实现即使不修改bean,也能指定哪些字段不序列化

一个简单的demo如下,如果包含自定义的注解,则不序列化,或者field_name == pwd也不序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IgnoreField {
}


@Test
public void testExclude() {
Gson gson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes fieldAttributes) {
if (fieldAttributes.getAnnotation(IgnoreField.class) != null) {
// 包含这个注解的,直接忽略
return true;
}

// 成员白名单
if (fieldAttributes.getName().equalsIgnoreCase("pwd")) {
return true;
}
return false;
}

@Override
public boolean shouldSkipClass(Class<?> aClass) {
if (aClass.isAnnotationPresent(IgnoreField.class)) {
return true;
}
return false;
}
}).registerTypeAdapterFactory(new MyMapTypeAdapterFactory(new ConstructorConstructor(new HashMap<>()), false)).create();

GItem item = new GItem();
item.setUser("一灰灰");
item.setPwd("123456");

System.out.println(gson.toJson(item));
}

上面这种姿势,更适用于有自定义需求场景的case,那么问题来了,如果我希望序列化的对象,并不是JOPO对象,比如传入的是一个Map,也希望针对某些key进行忽略,可以怎么整呢?

II. 其他

1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

3. 扫描关注

一灰灰blog

QrCode

211018-ElasticSearch全文搜索支持配置

在es的使用过程中,全文搜索属于一个常见的场景,特别是当我们将es作为日志存储检索来使用时,根据关键字查询对应的日志信息,可以怎么处理呢?

211011-构建一个创建Map的工具类来辅助理解可变传参

虽说java作为编译语言,但是它本身也提供了很多运行时能力,今天介绍一个非常基础的知识点,可变参数传递

211009-git ammend知识点

在实际使用git的过程中,难免会存在手误的场景,比如 git commit之后,发现提交的描述信息不太合适,想调整一下;或者发现本地有多个零碎未提交的commit,想合并成一个提交…

当我们出现这些需求场景的时候,可以考虑使用git commit --amend来实现

210916-Quick-Media 中秋到了,是时候给你的二维码加个月饼了

又一年的中秋将至,要怎么样才能蹭一波它的热度呢?作为一个coder,是不是可以用代码写首诗?想法是好,可惜难度有点大,那么就简单点,给自己的二维码上,加个月饼吧

210903-实战小技巧17:随机数生成怎么选

每天一个实战小技巧,随机数生成怎么选

随机数生成,java中有一个专门的Random类来实现,除此之外,使用Math.random的也比较多,接下来我们简单学习下,随机数的使用姿势

210902-实战小技巧16:Properties配置文件自动装载JavaBean

每天一个实战小技巧,Properties配置文件自动装载JavaBean

SpringBoot的配置自动装载,使用起来还是很舒爽的,可以非常简单的将properties配置文件的内容,填充到Java bean对象中,如果我们现在是一个脱离于Springboot框架的项目,想实现上面这个功能,可以怎么来做呢?

210901-实战小技巧15:如何判断类为基础类型or基础类型的包装类

每天一个实战小技巧,判断类为基础类型or基础类型的包装类

判断一个类是否为基础类型属于常规操作了,一般我们遇到这种case,要怎么处理呢?

一个一个的if/else判断? 还是其他的操作姿势?

210830-实战小技巧14:配置文件Properties

每天一个实战小技巧,Properties配置文件

properties配置文件,相信各位小伙伴都不会太陌生,常用Spring的可能会经常看到它,虽说现在更推荐的是使用Yaml配置文件,但是properties配置文件的使用频率也不低

在jdk中有一个直接关连的类Properties,接下来我们来看一下它的用法

210826-实战小技巧13:进制转换很简单

每天一个实战小技巧,进制转换很简单

进制转换,属于基本技能了,在java中要实现进制转换很简单,可以非常简单的实现,接下来我们来看下它的使用姿势

210825-实战小技巧12:数字格式化

每天一个实战小技巧,数字格式化

数字的格式化场景,更多的是在日志输出、金额计算相关的领域中会用到,平常我们可能更多使用String.format来格式化,但是请注意,数字格式化是有一个DecimalFormat,专门来针对数字进行格式化

今天我们的知识点就是DecimalFormat来实现数字格式化

210821-实战小技巧11:数组拷贝

每天一个实战小技巧,数组拷贝

说实话,在实际的业务开发中,基本上很少很少很少…会遇到数组拷贝的场景,甚至是我们一般都不怎么用数组,List它不香嘛,为啥要用数组

现在问题来了,要实现数组拷贝,怎么整?

210820-实战小技巧10:不可变容器

每天一个小技巧:不可变容器

不可变容器,看着好像在实际的业务中不怎么会用到,但实则不然,相信每个小伙伴都用过,或者看到过下面的代码

1
2
Collections.emptyList();
Collections.emptyMap();

今天我们来介绍一下如何使用不可变容器,以及使用时的注意事项

210819-实战小技巧9:List.subList使用不当StackOverflowError

实战小技巧:List.subList使用不当StackOverflowError

相信每个小伙伴都使用过List.subList来获取子列表,日常使用可能没啥问题,但是,请注意,它的使用,很可能一不小心就可能导致oom

210818-实战小技巧8:容器的初始化大小指定

每天一个实战小技巧:容器的初始化大小指定

容器可以说是我们日常开发中,除了基本对象之外,使用最多的类了,那么平时在使用的时候,是否有主意到良好编程习惯的大佬,在创建容器的时候,一般会设置size;那么他们为什么要这么干呢?是出于什么进行考量的呢?

今天我们将针对最常见的List/Map/Set三种容器类型的初始化值选择,进行说明

210817-实战小技巧7:排序比较要慎重

每天一个实战小技巧:排序比较要慎重

今天介绍的又是一个非常非常基本的基本知识点,为啥要单独拎出来?还是因为这个东西虽然非常简单,但是很容易掉坑,我已经遇到几次不严谨的写法了

210816-实战小技巧6:枚举的特殊用法

每天一个实战小技巧:枚举的特殊用法

难道我们日常使用的枚举还有什么特殊的玩法不成?没错,还真有,本文主要介绍枚举的两种不那么常见的使用姿势

  • 利用枚举来实现单例模式
  • 利用枚举来实现策略模式

210814-实战小技巧5:驼峰与下划线互转

每天一个实战小技巧:驼峰与下划线划转

这个考题非常实用,特别是对于我们这些号称只需要CURD的后端开发来说,驼峰与下划线互转,这不是属于日常任务么;一般来讲db中的列名,要求是下划线格式(why? 阿里的数据库规范是这么定义的,就我感觉驼峰也没毛病),而java实体命名则是驼峰格式,所以它们之间的互转,就必然存在一个驼峰与下划线的互转

今天我们就来看一下,这两个的互转支持方式

210812-实战小技巧4:优雅的实现字符串拼接

每天一个实战小技巧,字符串拼接

相信没有小伙伴没有写过这样的代码,比如说现在让我们来实现一个字符串拼接的场景,怎样的实现才算是优雅的呢?

210811-实战小技巧3:字符串与容器互转

每天一个实战小技巧:字符串与Collection的互转

将字符串转换为List,这种业务场景可以说非常非常常见了,实现方式也比较简单

1
2
3
4
public List<String> str2list(String str, String split) {
String[] cells = str.split(split);
return Arrays.asList(cells);
}

那么除了上面这种实现方式之外,还有其他的么?

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×