对象相互引用的时候如何序列化呢

对象相互引用的时候如何序列化呢

月光魔力鸭

2018-08-28 17:10 阅读 1005 喜欢 0 json 对象引用 引用替换

背景:

java 对象中有很多引用,甚至会出现循环引用,比如 user 对象中有 school 对象,school 对象中又有 user 对象,这样在对 user 对象序列化的时候,就会出现死循环,导致内存溢出。通过一定的方式,将每个对象增加ID 和 REF 引用标识最终可以解决这个问题,生成类似下面的样式:

引用对象

这样就相当于给 user 对象增加一个 $id 标识,且值为 3,在school 中引用 user 对象的时候,只需要增加一个 $ref 值为 3的引用即可。 但是,序列化的字符串传递给前台后,生成的 JSON对象中还需要再替换回来,所以就有了 json 对象的引用替换。

解决思路:

将对象中的所有 $id 的对象取出放到容器中,然后将对象中所有包含 $ref 属性的对象,根据值替换为容器中的对象。(这里不考虑对象本身含有 $id 和 $ref 名称的属性)

代码:


<script type="text/javascript">
	var t = '{"name":"lixun","user":{"name":"xx","school":{"name":"sss","user":{"$ref":"3"}},"$id":"3"}}';
	var tt = '';
	var target = eval('('+t+')');
	console.log(target);
	var fixObject = function(target){
		var map = {};
		var scan = function(o){
			if(o.hasOwnProperty('$id')){
				var v = o['$id'];
				map[v] = o;
				// console.log(o.prototype.constructor);
			}
			//如果含有ID ,则为独立对象,需要对ref进行替换
			if(!$.isEmptyObject(o) && !$.isFunction(o) ){
				for(var n in o){
					if(o.hasOwnProperty(n)){
						if(o[n] instanceof Object){
							scan(o[n]);
						}	
					}
				}
			}	
		};
		var replaceObj = function(o){
			if(o.hasOwnProperty('$ref')){
				var v = o['$ref'];
				o = map[v];
				return o;//关键点
			}
			if(!$.isEmptyObject(o) && !$.isFunction(o)){
				for(var n in o){
					if(o[n] instanceof Object){
						o[n] = replaceObj(o[n]);//关键点
					}
				}
			}
			return o;
		};
		scan(target);
		console.log(map);
		replaceObj(target);
	};


	fixObject(target);
	console.log(target);


</script>

效果图:

效果图

这样就可以出现循环引用的效果了,而且所有的 $ref 属性的对象都可以查找到原本的值了。

转载请注明出处: https://chrunlee.cn/article/json-parse-convert-replace.html


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
之前一直没面试过前端,今天有一个,先整理下需要问的问题和答案。这里都是一些简单的问题,关于当下比较流行的框架并没有涉及到..
最近一直在想着抓一些网盘数据,进行资料归拢,可是当我真正开始的时候.. 还是遇到了反爬,当然我本身就有心理预期,这是肯定会碰到的,只是没想到会在代理IP上耗费这么久,之前的时候也处理过代理IP ,可是由于一知半解,导致很多配置都不理解,debug全靠猜...
在使用echarts 来做统计报表的时候,由于数量较多,准备将同类型的相同属性抽取出来,然后用来做默认属性的。结果发现一个问题
通过canvas可以进行画图实现一些动画效果等,今天练习下通过canvas来实现一个简易的电子画板,可以在白板上进行画画,然后指定不同的颜色、线条粗细,加载不同的背景以及擦除效果。
项目中需要使用treegrid,找了下easyui 和 ext都有,但是项目用的框架是 byyui,如果为了treegrid 就把这些都加载的话,感觉不太合算。找了大家常用的基于jquery的treegrid.
在我们web开发过程中经常会碰到针对table的一些dom操作,这里整理一下关于这方面的知识点。当然我们可以通过jquery这样的插件来处理,或许会更简单一些,不过现在简单说下原生JS是如何操作的
做作业的时候,需要在手机上预览下,但是发现如果想在移动端上展示A4样子的作业还是挺麻烦的,最后还是准备通过图片来展示,然后移动端缩放呗。。
最近做个nodejs的项目,使用了thinkjs 3.0 的框架,编辑器为vs code ,之前用的好好的,每次 . 后都有提示的,可是使用了多模块后发现.. model的提示没有了..