您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页Gson序列化指定忽略字段的三种写法详解

Gson序列化指定忽略字段的三种写法详解

来源:意榕旅游网
Gson序列化指定忽略字段的三种写法详解

⽬录

1. transient关键字2. expose注解3. ⾃定义排查策略ExclusionStrategy在我们⽇常使⽤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(\"⼀灰灰\ 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(\"⼀灰灰\

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序列化指定忽略字段内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务