Gson序列化指定忽略字段的三种写法详解
在我们日常使用json序列化框架过程中,经常会遇到在输出json字符串时,忽略某些字段,那么在Gson框架中,要想实现这种方式,可以怎么处理呢?
本文介绍几种常见的姿势
1. transient关键字
最容易想到的case,就是直接借助jdk的transient关键字来修饰不希望输出的对象,如
@Data @AllArgsConstructor @NoArgsConstructor public static class GItem { private String user; // @IgnoreField private transient String pwd; }
上面的对象中,pwd前面使用transient进行修饰,那么在输出json串时,默认会忽略
@Test
public void testPrint() { GItem item = new GItem("一灰灰", "yihui"); String ans = new Gson().toJson(item); System.out.println(ans); }
输出如
{"user":"一灰灰"}
2. expose注解
借助gson提供的expose注解,也可以实现上面的case,如在需要保留的字段上添加@Expose
@Data @AllArgsConstructor @NoArgsConstructor public static class GItem { @Expose private String user; // @IgnoreField private String pwd; }
然后我们使用的地方,注意通过 GsonBuilder来创建Gson对象
@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也不序列化
@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进行忽略,可以怎么整呢?
到此这篇关于Gson序列化指定忽略字段的三种写法详解的文章就介绍到这了,更多相关Gson序列化指定忽略字段内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
原文出处:https://juejin.cn/post/7022955479923949599
相关文章
Jackson反序列化@JsonFormat 不生效的解决方案
这篇文章主要介绍了Jackson反序列化@JsonFormat 不生效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-10- 这篇文章主要介绍了解决Golang json序列化字符串时多了\的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-24
- 序列化是一种对象持久化的手段,普遍应用在网络传输、RMI等场景中,这篇文章主要给大家总结介绍了关于java序列化与反序列化的使用方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下...2021-07-29
- 下面小编就为大家带来一篇protobuf对象二进制序列化存储(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 经常看到一些配置文件里面存放的是一些类似带有格式的变量名称和值,其实就是一个序列化的过程,在需要用到这些数据库的时候会进行一个反序列化过程,就是将这个字符串再还原成他原来的数据结构。下面说说php 如何进行数据...2015-10-30
- 这篇文章主要介绍了C#实现的json序列化和反序列化代码实例,本文讲解了两种实现方法,并直接给出代码示例,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C#实现的序列化通用类,实例分析了C#序列化与反序列化操作相关技巧,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了Jackson 反序列化时实现大小写不敏感设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-29
- 在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象。...2020-06-25
- 这篇文章主要介绍了C#中Serializable序列化,以实例形式详细讲述了系列化的技术及各种序列化方法,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- 下面小编就为大家带来一篇用序列化实现List<T> 实例的深复制(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要介绍了C#实现复杂XML的序列化与反序列化的方法,是非常实用的一个技巧,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了javascript中from 表单序列化提交的实现方法,代码简单易懂,非常不错,需要的朋友参考下吧...2017-01-23
深入分析XmlSerializer对象的Xml序列化与反序列化的示例详解
本篇文章是对XmlSerializer 对象的Xml序列化与反序列化的应用进行了详细的分析介绍,需要的朋友参考下...2021-09-22- 这篇文章主要介绍了Python实现序列化及csv文件读取,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-04-22
- 这篇文章主要介绍了.Net中的序列化和反序列化详解的相关资料,需要的朋友可以参考下...2021-09-22
- 这篇文章主要介绍了C# 三种序列化方法,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C#使用XML序列化操作菜单的方法,是基于上一篇递归读取XML菜单数据的改进方法,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要为大家介绍了JavaScript对象序列化的相关资料,需要的朋友可以参考下...2016-01-21
- 最常用的序列化是把某个类序列化成二进制文件.但有时我们也会把类序列化成xml文件,需要的朋友可以参考下...2020-06-25