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);
}
[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));
}
[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); // <---
}
[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);
}
[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);
}
[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);
}
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);
}
相关文章推荐
- 升级 HTTPS,价值何在?
- python packages
- R-导入Excel数据
- COLLATE LOCALIZED ASC
- iOS网络请求——NSURL
- 《互联网时代》第一集·时代
- 【VNC】Linux环境VNC服务安装、配置与使用
- OS的进程调度及优先级反转
- wiki百科翻译之Lean software development之Amplify learning
- colgroup-table
- SOA面向服务的体系架构概述
- 面向对象address book framework的使用
- 六款值得推荐的android(安卓)开源框架简介
- iOS 设置启动页 不显示问题解决
- 读者汇app项目案例源码
- 有关于mfc webbrowser插件的使用
- php Xdebug调试
- 紫金桥组态软件分屏显示技术的应用
- 百度整顿贴吧盗版 国家版权局给了个大大的赞
- uva 839 Not so Mobile