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

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

最简单的用法

假设有下面这个类:

[java] view plaincopy
  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用法如下所示:

[java] view plaincopy
  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 plaincopy
  1. class MyObj {
  2. private int intField;
  3. private String strField;
  4. }
[java] view plaincopy
  1. @Test
  2. public void gson() {
  3. MyObj obj = new MyObj();
  4. Assert.assertEquals("{\"intField\":0}", new Gson().toJson(obj));
  5. }

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

[java] view plaincopy
  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 plaincopy
  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. }
[java] view plaincopy
  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 plaincopy
  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. }
[java] view plaincopy
  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标注的字段会被排除,如下所示:

[java] view plaincopy
  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. }
[java] view plaincopy
  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定制字段排除策略

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

[java] view plaincopy
  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. }
[java] view plaincopy
  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. 【java】Java运行时动态生成类几种方式

    1.概述 转载:Java运行时动态生成类几种方式 这里发现自己不知道的,原来Java 还能自己编译自己,学到了. 最近一个项目中利用规则引擎,提供用户拖拽式的灵活定义规则.这就要求根据数据库数据动态生 ...

  2. html js 设置样式,原生js设置样式 笔记:JS设置CSS样式的几种方式

    document(id名).style.backgroundColor = "ren" css里的属性有-的就去掉将首字母大写. js如何添加CSS样式中的class添加属性 用J ...

  3. 从 Gson 中的序列化中排除字段

    1. 概述 在这个简短的教程中,我们将探索从 Gson 序列化中排除 Java 类及其子类的一个或多个字段的可用选项. 2. 初始设置 让我们首先定义我们的类: @Data @AllArgsConst ...

  4. fastjson 不转某些字段_全面总结Fastjson过滤字段、排除字段的5种方法(含示例)...

    1.通过注解指定不需要序列化的字段 在不需要序列化的字段,添加@JSONField(serialize = false)注解可进行排除. public class DontSerializeAnnot ...

  5. 实现自定义字段的几种方式

    谈一谈自定义字段实现的几种方式 我们经常会遇到项目中很多对表单进行自定义,比如说saas应用针对租户自定义表单字段名称,自定义列表名称. 还有更高级自定义,比如说自定义的模块,表单.字段.字段类型.流 ...

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

    三种常用的方式 如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式. python script.py 0,1,2 10 python script ...

  7. Android 编程下帧动画在 Activity 启动时自动运行的几种方式

    Android 开发过程中部分 Activity 在显示的时候就要求给用户显示一个进度框来改善用户体验,比如:Activity 在启动的时候就去联网请求数据.读取数据库内容等.进度框显示样式如下,采用 ...

  8. linux启动时挂载rootfs的几种方式 .

    转载链接:http://blog.csdn.net/zuokong/article/details/9022707 根文件系统(在样例错误消息中名为 rootfs)是 Linux 的最基本的组件.根文 ...

  9. 008_Gson从序列化中排除字段

    1. 默认情况下, GSON从序列化/反序列化过程中排除瞬态和静态字段. 2. 例子 2.1. 新建一个名为GsonExcludeFields的Java项目, 同时添加相关jar包. 2.2. 新建S ...

最新文章

  1. DataReader方式 获取数据
  2. ABAP 如何实现屏幕字段不可输入
  3. Linux 磁盘管理 二(Raid、LVM、Quota)
  4. 使用百度UEditor
  5. sigar如何获取linux的buffer内存,Linux 下使用Sigar 获取内存信息
  6. 纽约时报》:乔布斯和苹果的“保密文化”
  7. linux下时区的一些认识
  8. JSF是什么?它与Struts是什么关系?
  9. 王道机试指南读后总结-5(迷宫深搜问题详解)
  10. Python办公自动化 - 2 Word办公自动化
  11. “会用LabVIEW,但是却没有听说TestStand,好像有点说不过去吧!”(下)
  12. 双基因突变患者_肺癌多EGFR基因突变 7成脑转移 双标靶并用 有效控制肿瘤
  13. Package.json文件配置
  14. download 下载文件 IE兼容性处理
  15. 将小米SoundMove 无缝接入 ChatGPT
  16. XTransfer又双叒叕拿奖,XTransfer外贸收款这么靠谱吗?
  17. Win10 下安装Mathtype6.9 + office2013+EndNote-x8
  18. 深入浅出Java clone技术
  19. 2007年最杰出十大新锐站长评选-------关注!
  20. myeclipse下载git中的代码步骤

热门文章

  1. OpenGL中glTranslate*(),glRotation*(),glScale*()函数的用法(*是参数数据类型)
  2. dubbo自定义异常传递信息丢失问题解决
  3. leetcode 268. Missing Number
  4. Linux系统存储交换机日志
  5. jQuery实现父窗口的问题
  6. oracle database link使用说明
  7. .Net Core下如何管理配置文件
  8. JPA学习(6)JPQL
  9. C语言树形打印二叉树
  10. github Git 原理简介