GSON使用筆記(1) -- 序列化時排除字段的幾種方式

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:排除null字段

null字段,默認就不會序列化的,如下所示:

    class MyObj {
        
        private int intField;
        private String strField;
        
    }
    @Test
    public void gson() {
        MyObj obj = new MyObj();
        Assert.assertEquals("{\"intField\":0}", new Gson().toJson(obj));
    }
要想序列化null字段,需要顯示的進行設置:

    @Test
    public void serializeNulls() {
        MyObj obj = new MyObj();
        Gson gson = new GsonBuilder().serializeNulls().create();
        Assert.assertEquals("{\"intField\":0,\"strField\":null}", gson.toJson(obj));
    }

方法2:排除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); // <---
    }

方法3:排除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);
    }

方法4:使用@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);
    }

方法5:使用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);
    }





發佈了61 篇原創文章 · 獲贊 72 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章