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

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

最简单的用法

假设有下面这个类:

  1. class MyObj {
  2. public int x;
  3. public int y;
  4. public MyObj(int x, int y) {
  5. this.x = x;
  6. this.y = y;
  7. }
  8. }

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

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

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

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

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

  1. class MyObj {
  2. public transient int x; // <---
  3. public int y;
  4. public MyObj(int x, int y) {
  5. this.x = x;
  6. this.y = y;
  7. }
  8. }
  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实例,如下所示:

  1. class MyObj {
  2. protected int x; // <---
  3. public int y;
  4. public MyObj(int x, int y) {
  5. this.x = x;
  6. this.y = y;
  7. }
  8. }
  1. @Test
  2. public void gson() {
  3. Gson gson = new GsonBuilder()
  4. .excludeFieldsWithModifiers(Modifier.PROTECTED) // <---
  5. .create();
  6. MyObj obj = new MyObj(1, 2);
  7. String json = gson.toJson(obj); // <---
  8. Assert.assertEquals("{\"y\":2}", json);
  9. }

方法4:使用@Expose注解

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

  1. class MyObj {
  2. public int x;
  3. @Expose public int y; // <---
  4. public MyObj(int x, int y) {
  5. this.x = x;
  6. this.y = y;
  7. }
  8. }
  1. @Test
  2. public void gson() {
  3. Gson gson = new GsonBuilder()
  4. .excludeFieldsWithoutExposeAnnotation() // <---
  5. .create();
  6. MyObj obj = new MyObj(1, 2);
  7. String json = gson.toJson(obj);
  8. Assert.assertEquals("{\"y\":2}", json);
  9. }

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

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

  1. class MyObj {
  2. public int _x; // <---
  3. public int y;
  4. public MyObj(int x, int y) {
  5. this._x = x;
  6. this.y = y;
  7. }
  8. }
  1. @Test
  2. public void gson() {
  3. ExclusionStrategy myExclusionStrategy = new ExclusionStrategy() {
  4. @Override
  5. public boolean shouldSkipField(FieldAttributes fa) {
  6. return fa.getName().startsWith("_"); // <---
  7. }
  8. @Override
  9. public boolean shouldSkipClass(Class<?> clazz) {
  10. return false;
  11. }
  12. };
  13. Gson gson = new GsonBuilder()
  14. .setExclusionStrategies(myExclusionStrategy) // <---
  15. .create();
  16. MyObj obj = new MyObj(1, 2);
  17. String json = gson.toJson(obj);
  18. Assert.assertEquals("{\"y\":2}", json);
  19. }

GSON使用笔记(1) -- 序列化时排除字段的几种方式的更多相关文章

  1. 命令行运行Python脚本时传入参数的三种方式

    原文链接:命令行运行Python脚本时传入参数的三种方式(原文的几处错误在此已纠正) 如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式. pyth ...

  2. Gson序列化对象时排除字段

    import com.google.gson.ExclusionStrategy; import com.google.gson.FieldAttributes; /** *Gson序列化对象排除属性 ...

  3. FastJson序列化时过滤字段(属性)的方法总结

    FastJson序列化时(即转成JSON字符串时),可以过滤掉部分字段,或者只保留部分字段,方法有很多,下面举一些常用的方法. 方法一.FastJson的注解 @JSONField(serialize ...

  4. java 序列化时排除指定属性

    java 序列化对象如何排除指定属性呢? java 中序列化对象有多种方式:struts2 ,jackson,json-lib (1)使用struts2 json插件 依赖的jar包:struts2- ...

  5. spring学习笔记2---MVC处理器映射(handlerMapping)三种方式(附源码)

    一.根据Beanname访问controller: 在springmmvc-servlet.xml的配置handlermapping中加入beanname,通过该beanname找到对应的contro ...

  6. 关于Linux启动时挂载rootfs的几种方式

    一直对Linux启动时挂载根文件系统的过程存在着很多疑问,今天在水木精华区找到了有用的资料,摘录如下: 1.Linux启动时,经过一系列初始化之后,需要mount 根文件系统,为最后运行init进程等 ...

  7. 【开发笔记】- Java读取properties文件的五种方式

    原文地址:https://www.cnblogs.com/hafiz/p/5876243.html 一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供j ...

  8. python中json序列化时汉字变成编码的解决方式

    我们在使用json模块时,如果被序列化对象中不包含汉字,当然没有任何问题,但是有汉字会被编译成unicode码: import json dic = {","sex":& ...

  9. 精通awk系列(8):awk划分字段的3种方式

    回到: Linux系列文章 Shell系列文章 Awk系列文章 详细分析awk字段分割 awk读取每一条记录之后,会将其赋值给$0,同时还会对这条记录按照预定义变量FS划分字段,将划分好的各个字段分别 ...

随机推荐

  1. 关于开发中 hosts 文件的修改

    这篇文章只是给自己做个笔记吧. 最近的工作经常要改 hosts 文件(C:\Windows\System32\drivers\etc\hosts),并且改完后不立即生效.小胡子哥 提到: 因为服务器设 ...

  2. IIS W3SVC 无法启动1068错误的解决

    苦苦寻找解决方法多天之后,终于看到了最简单的处理方法. 故障: 试遍网上各种方法,司马当活马,CMD下输入如下命令,然后重启: fsutil resource setautoreset true C: ...

  3. [BZOJ2768][JLOI2010]冠军调查(最小割)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2768 分析: 如果一个点i认为是0,则连一条S->i,如果认为是1,则i-> ...

  4. REST API (from IBM)

    REST 本身是设计风格而不是标准.REST 谈论一件非常重要的事,如何正确地使用 Web标准,例如,HTTP 和 URI.想要了解 REST 最好的方式就是思索与了解 Web 及其工作方式.如果你设 ...

  5. Webservice学习

    参考博客1: http://www.cnblogs.com/lzhp/archive/2013/01/13/2858559.html 参考博客2:http://blog.csdn.net/shilei ...

  6. Tomcat本地服务器搭建

    首先,下载jdk-8u111-windows-x64.exe,然后配置环境,以安装目录D:\jdk1.8.0_111为例: 新建一个变量: 然后打开path新建两个变量: 最后去控制台敲javac或者 ...

  7. python2.7到python3代码转换脚本2to3的一些介绍

       你的位置: Home ‣ Dive Into Python 3 ‣ 难度等级: ♦♦♦♦♦   使用2to3将代码移植到Python 3 ❝ Life is pleasant. Death is ...

  8. Linux IO Scheduler(Linux IO 调度器)

    每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request.I/O调度器的基本目的是将请求按照它们对应在块设 ...

  9. 【BZOJ 2038】【2009 国家集训队】小Z的袜子(hose) 分块+莫队

    $SDOI2016Day-1$临时抱佛脚学习一下莫队算法$233$ 我预感到自己省选要爆0hhh #include<cmath> #include<cstdio> #inclu ...

  10. C#-WinForm-三级联动

    三级联动 - 查询地区,选择省份自动显示该省份的市.区县 有如下一个数据库 一.写查询方法 public class ChinaData { SqlConnection conn = null; Sq ...