GSON使用筆記(1) -- 序列化時排除欄位的幾種方式
阿新 • • 發佈:2019-01-11
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);
}