您的位置:首页 > 其它

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

2016-05-25 09:37 435 查看
http://blog.csdn.net/zxhoo/article/details/21471005

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

最简单的用法

假设有下面这个类:

[java] view plain copy







class MyObj {

public int x;

public int y;

public MyObj(int x, int y) {

this.x = x;

this.y = y;

}

}

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

[java] view plain copy







@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字段,默认就不会序列化的,如下所示:

[java] view plain copy

class MyObj {

private int intField;

private String strField;

}

[java] view plain copy

@Test

public void gson() {

MyObj obj = new MyObj();

Assert.assertEquals("{\"intField\":0}", new Gson().toJson(obj));

}

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

[java] view plain copy

@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修饰符就可以了,如下所示:

[java] view plain copy







class MyObj {

public transient int x; // <---

public int y;

public MyObj(int x, int y) {

this.x = x;

this.y = y;

}

}

[java] view plain copy







@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实例,如下所示:

[java] view plain copy







class MyObj {

protected int x; // <---

public int y;

public MyObj(int x, int y) {

this.x = x;

this.y = y;

}

}

[java] view plain copy







@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标注的字段会被排除,如下所示:

[java] view plain copy







class MyObj {

public int x;

@Expose public int y; // <---

public MyObj(int x, int y) {

this.x = x;

this.y = y;

}

}

[java] view plain copy







@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定制字段排除策略

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

[java] view plain copy







class MyObj {

public int _x; // <---

public int y;

public MyObj(int x, int y) {

this._x = x;

this.y = y;

}

}

[java] view plain copy







@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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: