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

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

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

 

最简单的用法

假设有下面这个类:

 

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  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.       
  11. }  


最简单的GSON用法如下所示:

 

 

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. @Test  
  2. public void gson() {  
  3.     MyObj obj = new MyObj(1, 2);  
  4.     String json = new Gson().toJson(obj);  
  5.     Assert.assertEquals("{\"x\":1,\"y\":2}", json);  
  6. }  

 

方法1:排除null字段

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

 

[java] view plain copy
 
  1. class MyObj {  
  2.       
  3.     private int intField;  
  4.     private String strField;  
  5.       
  6. }  
[java] view plain copy
 
  1. @Test  
  2. public void gson() {  
  3.     MyObj obj = new MyObj();  
  4.     Assert.assertEquals("{\"intField\":0}", new Gson().toJson(obj));  
  5. }  

要想序列化null字段,需要显示的进行设置:

 

 

[java] view plain copy
 
  1. @Test  
  2. public void serializeNulls() {  
  3.     MyObj obj = new MyObj();  
  4.     Gson gson = new GsonBuilder().serializeNulls().create();  
  5.     Assert.assertEquals("{\"intField\":0,\"strField\":null}", gson.toJson(obj));  
  6. }  

 

方法2:排除transient字段

这个方法最简单,给字段加上transient修饰符就可以了,如下所示:

 

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. class MyObj {  
  2.       
  3.     public transient int x; // <---  
  4.     public int y;  
  5.       
  6.     public MyObj(int x, int y) {  
  7.         this.x = x;  
  8.         this.y = y;  
  9.     }  
  10.       
  11. }  
[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. @Test  
  2. public void gson() {  
  3.     MyObj obj = new MyObj(1, 2);  
  4.     String json = new Gson().toJson(obj);  
  5.     Assert.assertEquals("{\"y\":2}", json); // <---  
  6. }  

 

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

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

 

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. class MyObj {  
  2.       
  3.     protected int x; // <---  
  4.     public int y;  
  5.       
  6.     public MyObj(int x, int y) {  
  7.         this.x = x;  
  8.         this.y = y;  
  9.     }  
  10.       
  11. }  
[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. @Test  
  2. public void gson() {  
  3.     Gson gson = new GsonBuilder()  
  4.             .excludeFieldsWithModifiers(Modifier.PROTECTED) // <---  
  5.             .create();  
  6.       
  7.     MyObj obj = new MyObj(1, 2);  
  8.     String json = gson.toJson(obj); // <---  
  9.     Assert.assertEquals("{\"y\":2}", json);  
  10. }  

 

方法4:使用@Expose注解

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

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. class MyObj {  
  2.       
  3.     public int x;  
  4.     @Expose public int y; // <---  
  5.       
  6.     public MyObj(int x, int y) {  
  7.         this.x = x;  
  8.         this.y = y;  
  9.     }  
  10.       
  11. }  
[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. @Test  
  2. public void gson() {  
  3.     Gson gson = new GsonBuilder()  
  4.             .excludeFieldsWithoutExposeAnnotation() // <---  
  5.             .create();  
  6.       
  7.     MyObj obj = new MyObj(1, 2);  
  8.     String json = gson.toJson(obj);  
  9.     Assert.assertEquals("{\"y\":2}", json);  
  10. }  

 

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

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

 

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  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.       
  11. }  
[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. @Test  
  2. public void gson() {  
  3.     ExclusionStrategy myExclusionStrategy = new ExclusionStrategy() {  
  4.   
  5.         @Override  
  6.         public boolean shouldSkipField(FieldAttributes fa) {  
  7.             return fa.getName().startsWith("_"); // <---  
  8.         }  
  9.   
  10.         @Override  
  11.         public boolean shouldSkipClass(Class<?> clazz) {  
  12.             return false;  
  13.         }  
  14.           
  15.     };  
  16.       
  17.     Gson gson = new GsonBuilder()  
  18.             .setExclusionStrategies(myExclusionStrategy) // <---  
  19.             .create();  
  20.       
  21.     MyObj obj = new MyObj(1, 2);  
  22.     String json = gson.toJson(obj);  
  23.     Assert.assertEquals("{\"y\":2}", json);  
  24. }  



 

posted @   Bigben  阅读(1213)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2015-05-25 通过HTTP协议实现多线程下载
点击右上角即可分享
微信分享提示