`
bankly
  • 浏览: 8620 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

【FastJSON】解决FastJson中“$ref 循环引用”的问题

阅读更多

【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集合被序列化。

具体如下图所示。

【解决后的效果】

读者如要转载,请标明出处和作者名,谢谢。

地址01:

http://space.itpub.net/25851087


地址02:http://www.cnblogs.com/zjrodger
作者名:zjrodger  
分享到:
评论

相关推荐

    FastJson处理$ref的js类库 FastJson-1.0.min.js

    当项目中使用了fastjson框架转换json字符串后,默认情况下会有$ref这样的引用方式。 如果不使用此引用,在重复嵌套时,可能会耗尽系统资源。 但是如果启用的话,在页面js中又无法正常使用。 现只需要引入此js文件,...

    解决FastJson中"$ref重复引用"的问题方法

    在使用FastJson进行对象序列化成JSON字符串时,可能会遇到“$ref重复引用”的问题,这是由于FastJson在进行序列化过程中,为了优化性能和内存使用,会把相同的对象引用只序列化一次,并通过特殊的引用标签(如$ref)...

    详解在springmvc中解决FastJson循环引用的问题

    FastJson是阿里巴巴开源的一款高性能的JSON处理工具,广泛应用于Java应用程序中,特别是...通过上述配置方法,开发者可以有效地解决在Spring MVC中使用FastJson时遇到的循环引用问题,确保应用的健壮性和数据的正确性。

    高版本的fastjson-1.2.71解决安全漏洞.rar

    在标题提到的“高版本的fastjson-1.2.71解决安全漏洞”中,我们主要关注的是Fastjson如何通过更新到1.2.71版本来修复这些已知的安全问题。 Fastjson的安全漏洞通常涉及其自动类型识别机制。这个机制允许JSON字符串...

    C#简单快速的json组件fastJSON使用介绍.docx

    fastJSON 是一个快速的 JSON 组件,可以用于 C# 中对 JSON 数据的序列化和反序列化。下面是关于 fastJSON 的知识点: fastJSON 简介 fastJSON 是一个开源的 JSON 序列化组件,可以用于 C# 中对 JSON 数据的序列化...

    fastjson1.2.47远程代码漏洞解决方案.rar

    Fastjson,一个由阿里巴巴开发的高性能、轻量级的Java语言JSON处理库,因其高效的解析速度和广泛的功能,在国内的互联网行业中被广泛应用。然而,任何优秀的软件都有其潜在的安全风险,Fastjson也不例外。在1.2.47...

    Android FastJSON小示例

    在Android开发中,数据交换和序列化是常见的需求,FastJSON是阿里巴巴提供的一款高效、功能丰富的JSON库,它被广泛应用于Android Studio项目中。本文将详细介绍如何在Android Studio中使用FastJSON进行JSON解析和...

    fastjson-1.2.58.rar

    在给定的资源“fastjson-1.2.58.rar”中,包含了Fastjson的特定版本1.2.58的jar包,解压后可以直接在项目中引用,进行JSON和XML之间的转换操作。 一、Fastjson核心功能 1. JSON解析与生成:Fastjson可以将JSON字符...

    fastjson-1.2.17-API文档-中文版.zip

    赠送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-...

    Fastjson1.2.47以及之前的所有版本

    总的来说,了解并解决Fastjson的安全隐患对于任何使用该库的应用都是至关重要的。保持库的及时更新,结合合理的安全配置和输入验证,可以有效地保护系统免受恶意攻击。对于无法立即升级的场景,应当采取额外的安全...

    fastjson的jar包(alibaba.fastson引用所需jar包).rar

    阿里巴巴的Fastjson正是为解决这一问题而诞生的高效JSON库,它为Java开发者提供了便捷的JSON操作工具。 Fastjson是阿里巴巴开源的一个高性能的JSON库,它的主要功能包括JSON到Java对象的映射和Java对象到JSON字符串...

    最新fastJSON C#的JSON开发包 v2.1.18

    FastJSON 是一个高效的 JSON 序列化和反序列化库,尤其在C#开发环境中被广泛应用。它以其轻量级、快速和简单的特点,使得处理JSON数据变得极其便捷。在这个最新的版本 v2.1.18 中,FastJSON 提供了更多的优化和改进...

    fastjson-1.2.66_fastjson-1.2.66.jar_Fastjson_

    Fastjson是阿里巴巴开源的一个高性能的JSON库,它在Java世界中被广泛使用,为开发者提供了快速、方便地处理JSON数据的能力。Fastjson 1.2.66是该库的一个稳定版本,其核心功能包括JSON字符串与Java对象之间的转换,...

    FastJsonJar

    《FastJsonJar:Java开发中的高效JSON处理库》 FastJsonJar,正如其名,是一个专为Java开发者设计的高效JSON解析和生成工具。在现代Web服务和移动应用开发中,JSON作为数据交换格式,其使用频率之高不言而喻。...

    Android中FastJson解析json

    在Android开发中,我们通常会遇到以下几种场景,FastJson都能提供便捷的解决方案: 1. **JSON字符串到Java对象的转换**:FastJson提供了一种简单的方式来将JSON字符串解析成Java对象,例如: ```java String json...

    fastjson1.2.2.jar

    Fastjson是阿里巴巴开源项目中的明星产品,它的主要功能是将Java对象转换为JSON字符串,反之也能将JSON字符串解析为Java对象。Fastjson以其高速度和低内存消耗赢得了开发者们的青睐。在处理大规模数据时,其性能表现...

    fastjson各版本jar包以及使用方法

    Fastjson因其高效、便捷的特性,在众多JSON库中脱颖而出。 ### 一、Fastjson版本 Fastjson的各个版本针对不同的需求和性能优化进行迭代更新。随着时间的推移,新版本通常会修复已知问题,增加新功能,并提高性能。...

    fastjson的一个小例子

    在这个小例子中,我们将深入探讨FastJson的使用方法,以及它如何帮助开发者在Android开发中快速处理JSON数据。 在Android应用开发中,JSON是一种常见的数据交换格式,用于在服务器和客户端之间传递数据。FastJson以...

    fastjson-1.2.51-API文档-中文版.zip

    赠送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-1.2.83 针对近期阿里fastjson包漏洞,升级解决

    Fastjson 1.2.80 及之前版本使用黑白名单用于防御反序列化漏洞,经研究该防御策略在特定条件下可绕过默认 autoType 关闭限制,攻击远程服务器,风险影响较大。建议 Fastjson 用户尽快采取安全措施保障系统安全

Global site tag (gtag.js) - Google Analytics