【FastJSON】解决FastJson中“$ref 循环引用”的问题
【需求与环境描述】
0、开发环境
SSH,EasyUI,MySQL
1、需求要求:
(1)首先获取所有的贷款订单数据,即List <LoanOrder>。
(2)然后从单个贷款订单实体LoanOrder去访问贷款人实体Loaner的信息。
2、实体之间的关系描述
(1)LoanOrder实体与Loaner实体是双向的多对一和一对多关系。
(2)LoanOrder是“多方”,其中的关系属性为“private Loaner loaner”。
(3)Loaner是“一方”,其中的关系属性为“Set<LoanOrder> orders”。
3、代码示例
(1) 贷款订单LoanOrder代码
@Entity
@Table(name = "t_bp_loan_order")
public class LoanOrder implements java.io.Serializable {
/*省略其他次要属性*/
private Loaner loaner;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "LOANER_ID")
public Loaner getLoaner() {
return this.loaner;
}
}
(2) Loaner方代码
@Entity
@Table(name = "t_bp_loaner")
public class Loaner implements java.io.Serializable {
/* 其他普通属性略去 */
private Set<LoanOrder> loanOrders = new HashSet<LoanOrder>(0);
@OneToMany(fetch = FetchType.LAZY, mappedBy = "loaner")
@JSONField(serialize = true)
public Set<LoanOrder> getLoanOrders() {
return this.loanOrders;
}
}
【障碍再现】
1、需求01:
首先获取所有的贷款订单数据,即List <LoanOrder>,发现贷款人“ 张三 ”有两个订单。
服务器后台传送到前台页面上的JSON数据如下所示:
2、需求02:
然后,依次在第一个和第二个贷款订单中点击“张三”,从而去访问“名字叫做‘张三’”贷款人实体Loaner的信息。
结果,第一个订单可以显示贷款人的数据,但是在第二个订单数据中,不能获取到“loaner(贷款人)”的数据,并且loaner中提示“$ref”。
【解决方案】
第一步: 禁用 FastJson的“循环引用检测”特性。
1、核心代码
2、作用
决定了生成的“多个”JSON对象中,是否加载被引用的同一个对象的数据。
在此,决定了生成的“多个”贷款订单JSON对象中,是否加载被引用的同一个贷款人JSON对象的数据。
3、开启和关闭FastJson的“循环引用检测”特性的对比
当从服务器端传来的多个LoanOrder对象通过FASTJSON被序列化到“前端”后,会被浏览器解析成“DOM”对象。
(1)当开启FastJson的“循环引用检测”特性时:
1 ) 对于第一个LoanOrder 01,fastjson会完全解析并加载它的所有数据,包括它所关联的Loaner贷款人信息,如下图所示。
2 ) 对于第二个LoanOrder 02,fastjson仅仅解析并加载其贷款订单部分的数据,对于“$ref”所指向的 Loaner贷款人的数据,fastjson会因为“ 开启了 fastJson 的‘循环引用检测’机制 ”而不去加载该贷款人数据。
当加载第二个贷款订单数据时,fastjson检测到已经在第一个订单LoanOrder 01中加载了“贷款人Loaner”的数据,fastjson会因为“开启了‘循环引用检测’机制”而不去再次加载该贷款人数据,而仅仅将一个指向第一个贷款订单LoanOrder01中“贷款人”的引用赋值给第二个贷款订单中的贷款人的位置。
因此,在生成的第二个贷款订单的JSON串中,对于贷款人信息,仅仅只有一个“$ref ”。
而jQuery这个前端技术又无法解析该引用,因此,就无法读取贷款人的数据,如下图所示。
第二步:禁止Loaner对象获取Set<LoanOrder>的数据。
方法一: 将原来的“双向关系”修改为“单向关系”
1、原来:LoanOrder与Loaner之间是双向关系。
2、修改后:只能从LoanOrder访问Loaner,从Loaner无法访问到LoanOrder。
3、具体方法01
重要前提:不删除Loaner中的“Set<LoanOrder> orders”属性。
注意,若在采用注解映射实体类的方式中,没有使用“@Transient”注解,则数据库会报错。
4、具体方法 02
直接删除“Set<LoanOrder> orders”属性极其相关的setter()和getter()方法。
方法二: 不修改关系的前提下,禁止序列化
在不修改LoanOrder和Loaner双向关系的情况下,Loaner对象中的Set<LoanOrder>集合完成数据的加载,当其向前端Browser传递JSON数据时,禁止序列化Set<LoanOrder>集合。
具体方法:
设置注解“@JSONField(serialize =false)”。
说明:
A.“@JSONField”是fastjson提供的注解标签,其作用为控制其所标注的属性“能否被序列化”。
B.在此其作用为:禁止"loanOrders"这个Set集合被序列化。
具体如下图所示。
【解决后的效果】
读者如要转载,请标明出处和作者名,谢谢。
相关推荐
当项目中使用了fastjson框架转换json字符串后,默认情况下会有$ref这样的引用方式。 如果不使用此引用,在重复嵌套时,可能会耗尽系统资源。 但是如果启用的话,在页面js中又无法正常使用。 现只需要引入此js文件,...
在使用FastJson进行对象序列化成JSON字符串时,可能会遇到“$ref重复引用”的问题,这是由于FastJson在进行序列化过程中,为了优化性能和内存使用,会把相同的对象引用只序列化一次,并通过特殊的引用标签(如$ref)...
FastJson是阿里巴巴开源的一款高性能的JSON处理工具,广泛应用于Java应用程序中,特别是...通过上述配置方法,开发者可以有效地解决在Spring MVC中使用FastJson时遇到的循环引用问题,确保应用的健壮性和数据的正确性。
在标题提到的“高版本的fastjson-1.2.71解决安全漏洞”中,我们主要关注的是Fastjson如何通过更新到1.2.71版本来修复这些已知的安全问题。 Fastjson的安全漏洞通常涉及其自动类型识别机制。这个机制允许JSON字符串...
fastJSON 是一个快速的 JSON 组件,可以用于 C# 中对 JSON 数据的序列化和反序列化。下面是关于 fastJSON 的知识点: fastJSON 简介 fastJSON 是一个开源的 JSON 序列化组件,可以用于 C# 中对 JSON 数据的序列化...
Fastjson,一个由阿里巴巴开发的高性能、轻量级的Java语言JSON处理库,因其高效的解析速度和广泛的功能,在国内的互联网行业中被广泛应用。然而,任何优秀的软件都有其潜在的安全风险,Fastjson也不例外。在1.2.47...
在Android开发中,数据交换和序列化是常见的需求,FastJSON是阿里巴巴提供的一款高效、功能丰富的JSON库,它被广泛应用于Android Studio项目中。本文将详细介绍如何在Android Studio中使用FastJSON进行JSON解析和...
在给定的资源“fastjson-1.2.58.rar”中,包含了Fastjson的特定版本1.2.58的jar包,解压后可以直接在项目中引用,进行JSON和XML之间的转换操作。 一、Fastjson核心功能 1. JSON解析与生成:Fastjson可以将JSON字符...
赠送jar包:fastjson-1.2.17.jar; 赠送原API文档:fastjson-1.2.17-javadoc.jar; 赠送源代码:fastjson-1.2.17-sources.jar; 赠送Maven依赖信息文件:fastjson-1.2.17.pom; 包含翻译后的API文档:fastjson-...
阿里巴巴的Fastjson正是为解决这一问题而诞生的高效JSON库,它为Java开发者提供了便捷的JSON操作工具。 Fastjson是阿里巴巴开源的一个高性能的JSON库,它的主要功能包括JSON到Java对象的映射和Java对象到JSON字符串...
FastJSON 是一个高效的 JSON 序列化和反序列化库,尤其在C#开发环境中被广泛应用。它以其轻量级、快速和简单的特点,使得处理JSON数据变得极其便捷。在这个最新的版本 v2.1.18 中,FastJSON 提供了更多的优化和改进...
总的来说,了解并解决Fastjson的安全隐患对于任何使用该库的应用都是至关重要的。保持库的及时更新,结合合理的安全配置和输入验证,可以有效地保护系统免受恶意攻击。对于无法立即升级的场景,应当采取额外的安全...
《FastJsonJar:Java开发中的高效JSON处理库》 FastJsonJar,正如其名,是一个专为Java开发者设计的高效JSON解析和生成工具。在现代Web服务和移动应用开发中,JSON作为数据交换格式,其使用频率之高不言而喻。...
在Android开发中,我们通常会遇到以下几种场景,FastJson都能提供便捷的解决方案: 1. **JSON字符串到Java对象的转换**:FastJson提供了一种简单的方式来将JSON字符串解析成Java对象,例如: ```java String json...
在这个小例子中,我们将深入探讨FastJson的使用方法,以及它如何帮助开发者在Android开发中快速处理JSON数据。 在Android应用开发中,JSON是一种常见的数据交换格式,用于在服务器和客户端之间传递数据。FastJson以...
赠送jar包:fastjson-1.2.51.jar; 赠送原API文档:fastjson-1.2.51-javadoc.jar; 赠送源代码:fastjson-1.2.51-sources.jar; 赠送Maven依赖信息文件:fastjson-1.2.51.pom; 包含翻译后的API文档:fastjson-...
这个"fastJson依赖jar包"正是包含了Fastjson库的Java类库文件,供开发者在项目中引用使用。 Fastjson的核心功能包括以下几点: 1. **JSON解析与生成**:Fastjson提供了便捷的API,可以将JSON字符串解析成Java对象...
赠送jar包:fastjson-1.2.54.jar; 赠送原API文档:fastjson-1.2.54-javadoc.jar; 赠送源代码:fastjson-1.2.54-sources.jar; 赠送Maven依赖信息文件:fastjson-1.2.54.pom; 包含翻译后的API文档:fastjson-...
赠送jar包:fastjson-1.1.37.jar; 赠送原API文档:fastjson-1.1.37-javadoc.jar; 赠送源代码:fastjson-1.1.37-sources.jar; 赠送Maven依赖信息文件:fastjson-1.1.37.pom; 包含翻译后的API文档:fastjson-...
赠送jar包:fastjson-1.2.72.jar; 赠送原API文档:fastjson-1.2.72-javadoc.jar; 赠送源代码:fastjson-1.2.72-sources.jar; 赠送Maven依赖信息文件:fastjson-1.2.72.pom; 包含翻译后的API文档:fastjson-1.2....