2019独角兽企业重金招聘Python工程师标准>>>

特别说明:gson处理循环引用问题,不会影响java本身的序列化,只影响gson自身的,注意区分。

1. java对象引用成环说明:

    1.1 相互引用成环:

class A{B b;}class B{A a;
}

     1.2 自引用成环:

class A{A a;
}

2. 引用成环造成的问题:

在java中,对象引用成环问题,可以被jvm自动处理,但是将java对象转成json格式时,由于转换工具不能自行切断环,会导致无限解析最终会导致栈溢出错误。

3. 解决方法:

所有解决方法,基本原理都是将“环”切断。

1)gson提供了非常简洁的处理方式,将所有要转换成json的变量都用@Expose注解标记;将出现环的地方,不做任何处理。

2)创建gson构造器:

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();// 获取Gson构造器,可以过滤掉不带注解的字段

3)转换json:

gson.toJson(testOject);

使用上面第一个相互引用成环的例子举例说明:

3.1 阻断环路:

class A{@ExposeB b;}class B{A a;//不转换该字段,阻断循环引用
}

3.2 创建gson构造器,并转换json:

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();// 获取Gson构造器,可以过滤掉不带注解的字段
A testObj = new A();
String json = gson.toJson(testObj);//获取json数据

转载于:https://my.oschina.net/airship/blog/792414

使用gson解决java对象循环引用问题相关推荐

  1. java json循环引用_填坑,解决json对象循环引用,在复杂案例中的应用

    // 这是Kotlin代码,Java也是一样原理,都是用@JsonView实现单向透明.// 原理:使用@JsonView和withView(JvXxx) 让jackson从某一方向扫描时,直接忽略某 ...

  2. GSON将Java对象转成JSON时,如何排除某些字段

    GSON 是Google发布的 JSON 序列化/反序列化工具,非常容易使用.本文简要讨论在使用GSON将Java对象转成JSON时,如何排除某些字段. 最简单的用法 假设有下面这个类: 1 clas ...

  3. Java对象和引用变量

    对于引用变量的深层含义,未必在初学的时候就能深刻理解, 所以理解好下面这两句话的真正含义非常重要 Case cc=new Case();Case cc; cc=new Case(); 1.先搞清楚什么 ...

  4. java gc 循环引用_JVM(3)对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制...

    ①首先说一下,GC里边在JVM其中是使用的ROOT算法,ROOT算法,什么称作为ROOT呢,就是说类的静态成员,静态成员就是static修饰的那种,是"根"的一个,根还包含方法中的 ...

  5. FastJson、Jackson、Gson进行Java对象转换Json的细节处理

    前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...

  6. gson转对象变成null_FastJson、Jackson、Gson进行Java对象转换Json的细节处理

    转 https://blog.csdn.net/moneyshi/article/details/51830329 Java对象转换Json的细节处理 前言 Java对象在转json的时候,如果对象里 ...

  7. 使用Gson将Java对象转换为JSON

    Gson是Google的一个开源项目,可以将Java对象转换成JSON,也可能将JSON转换成Java对象. Gson里最重要的对象有2个Gson 和 GsonBuilder Gson有2个最基本的方 ...

  8. 堆栈关系java_从关键字说Java对象、引用、指针、堆栈的关系

    前言:上一篇中我们介绍了new关键字 点击打开链接,new一个类,实际上就是调用该类的构造函数,返回该类的对象.如a = new Animal();返回的对象赋给变量a.我们来分析一下内存分配的步骤, ...

  9. iOS 解决CADisplayLink造成循环引用方案

    最近在排查项目中存在的内存泄漏,今天和大家分享一个CADisplayLink造成循环引用的解决方案,造成内存循环引用的原因和NSTimer是一样的都是加入runloop后对target进行了一个强持有 ...

最新文章

  1. Cocos2d-x3.1颗粒使用
  2. 三:Bootstrap-js插件
  3. dhl: js判断网页对象是否存在
  4. 走近互联网先驱者——Henning Schulzrinne
  5. pt-online-schema-change 在线修改表结构
  6. Github|类别不平衡学习资源(上)
  7. 垃圾回收算法与实现系列-Java的Class文件详解
  8. shell脚本执行时报bad interpreter: Text file busy的解决方法
  9. python题目58:工厂流水线调度
  10. linux复制文件到另一台服务器
  11. 人人网登陆(selenium、PtantomJS结合)
  12. NVIDIA显卡怎么更新驱动
  13. 镜头MTF值的基本原理和解读
  14. response.text 与 response.content
  15. 分享Nexus桌面插件的安装及使用,超级好看、好用的插件。附下载链接。
  16. 拉普拉斯变换与闭环系统稳定探讨
  17. 基于SDN的访问控制模块实现
  18. 计算机考试函数应用题及答案,2016年全国职称计算机考试EXCEL考前练习题4
  19. oracle读取数据方式,关于oracle数据库读取数据的三种方式
  20. 「JavaSE」- 常用类

热门文章

  1. Character的static方法
  2. 从事前端开发,日常工作中必备的工具有哪些?
  3. C++基础教程之C++数据抽象
  4. Python基础笔记(二) List、tuple、循环语句
  5. 深入理解JAVA中的NIO
  6. underscore 系列之字符实体与 _.escape
  7. 乐思启慧教学系列—Bootstrap布局规则
  8. VS2008中 没有QT的代码智能提示
  9. 复制slave-skip-errors及error查看
  10. PLM 问卷调查表-A 关于公司