转载 

GSON使用笔记 -- 序列化时排除字段的几种方式

分类:    593人阅读    IT小君  2016-05-24 12:31

GSON 是Google发布的 JSON 序列化/反序列化工具,非常容易使用。本文简要讨论在使用GSON将Java对象转成JSON时,如何排除某些字段。

最简单的用法

假设有下面这个类:

class MyObj {
  
  public int x;
  public int y;
  
  public MyObj(int x, int y) {
      this.x = x;
      this.y = y;
  }
 }
最简单的GSON用法如下所示:

@Test
    public void gson() {
        MyObj obj = new MyObj(1, 2);
        String json = new Gson().toJson(obj);
        Assert.assertEquals("{\"x\":1,\"y\":2}", json);
    }
方法1:排除transient字段
这个方法最简单,给字段加上 transient 修饰符就可以了,如下所示:
class MyObj {
  
  public transient int x; // <---
  public int y;
  
  public MyObj(int x, int y) {
      this.x = x;
      this.y = y;
  }
  
    }
@Test
    public void gson() {
        MyObj obj = new MyObj(1, 2);
        String json = new Gson().toJson(obj);
        Assert.assertEquals("{\"y\":2}", json); // <---
    }

方法2:排除Modifier为指定类型的字段

这个方法需要用GsonBuilder定制一个GSON实例,如下所示:

class MyObj {
  
  protected int x; // <---
  public int y;
  
  public MyObj(int x, int y) {
      this.x = x;
      this.y = y;
  }
  
    }
@Test
    public void gson() {
  Gson gson = new GsonBuilder()
    .excludeFieldsWithModifiers(Modifier.PROTECTED) // <---
    .create();
  
  MyObj obj = new MyObj(1, 2);
  String json = gson.toJson(obj); // <---
  Assert.assertEquals("{\"y\":2}", json);
    }


方法3:使用@Expose注解

注意,没有被 @Expose 标注的字段会被排除,如下所示: 

class MyObj {
  
  public int x;
  @Expose public int y; // <---
  
  public MyObj(int x, int y) {
      this.x = x;
      this.y = y;
  }
  
    }
@Test
    public void gson() {
  Gson gson = new GsonBuilder()
    .excludeFieldsWithoutExposeAnnotation() // <---
    .create();
  
  MyObj obj = new MyObj(1, 2);
  String json = gson.toJson(obj);
  Assert.assertEquals("{\"y\":2}", json);
    }

方法4:使用ExclusionStrategy定制字段排除策略

这种方式最灵活,下面的例子把所有以下划线开头的字段全部都排除掉:

class MyObj {
  
  public int _x; // <---
  public int y;
  
  public MyObj(int x, int y) {
      this._x = x;
      this.y = y;
  }
  
    }
@Test
    public void gson() {
  ExclusionStrategy myExclusionStrategy = new ExclusionStrategy() {

      @Override
      public boolean shouldSkipField(FieldAttributes fa) {
    return fa.getName().startsWith("_");
      }

      @Override
      public boolean shouldSkipClass(Class<?> clazz) {
    return false;
      }
      
  };
  
  Gson gson = new GsonBuilder()
    .setExclusionStrategies(myExclusionStrategy) // <---
    .create();
  
  MyObj obj = new MyObj(1, 2);
  String json = gson.toJson(obj);
  Assert.assertEquals("{\"y\":2}", json);
    }

点击广告,支持我们为你提供更好的服务

小众时尚单品在线电子商务网站模板

html5 canvas进度条圆环图表统计动画特效

响应式太阳能能源公司网站模板

html5 svg夜空中星星流星动画场景特效

HTML5 Canvas竖直流动线条背景动画特效

css鼠标跟随文字模糊特效

jQuery右端悬浮带返回顶部特效

HTML5数字产品服务公司网站模板

canvas炫酷鼠标移动文字粒子特效

有机水果蔬菜HTML5网站模板

响应式时尚单品在线商城网站模板

js+css3抽奖转盘旋转点餐代码

html5图标下拉搜索框自动匹配代码

现代时尚家具公司网站模板

网页设计开发公司网站模板

css+js实现的颜色渐变数字时钟动画特效

HTML5现代家居装潢公司网站模板

html5 canvas彩色碎片组合球形旋转动画特效

中小型创意设计服务公司网站模板

响应式咖啡饮品宣传网站模板

点击广告,支持我们为你提供更好的服务
 工具推荐 更多»
点击广告,支持我们为你提供更好的服务