GSON将Java对象转成JSON时,如何排除某些字段


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

    最简单的用法

    假设有下面这个类:

     1 class MyObj {
     2   
     3   public int x;
     4   public int y;
     5   
     6   public MyObj(int x, int y) {
     7       this.x = x;
     8       this.y = y;
     9   }
    10 }

     

    最简单的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);
        }

     

    来自http://blog.csdn.net/zxhoo/article/details/21471005

     

     

     

  • 免责声明!

    本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



     
    粤ICP备18138465号  © 2018-2025 CODEPRJ.COM