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

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

月光魔力鸭

2018-08-28 17:10 阅读 801 喜欢 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


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
之前的时候都是在各大主机厂商手动进行申请免费的,直到阿里的免费期限变更为3个月.. 我就开始觉的有些麻烦了,还不如使用这个let's encrypt进行部署呢。
本文概括了递归、闭包、原型、继承,理清这些基本的概念,有助于你接纳更多的东西,我们会在下一个章节对函数进行更深入的讨论。
偶尔练习下canvas,这里简单记录下常用API,防止遗忘..加深记忆..努力提高..争取突破...daydayup
在项目开发过程中,分页是少不了的,之前封装了一个分页组件,样式是基于bootstrap的样式,当然也可以自己来修改
错误:The operation is insecure . 在使用canvas的 toDataUrl的时候报错,看了很多资料,基本上都说是设置跨域,但是我一直都有的啊。其实,只是顺序错了,setAttribute('crossOrigin','Anonymous') 要在设置 src之前设置。
在开发过程中多个页面使用的一个小工具类,简单完善了下,还算不错,给各位提供下小思路。
关于web打印,需要对页面内容进行页面样式设置,呈现出分页的样子,同时对于题目中的图片或表格尽量不分到两个页面中,因此实现了一个jquery的web打印插件,当然,这个插件目前只适用于部分情况,仅供借鉴
在文件上传的时候,经常会对文件的mime进行限制,比如图片 image/jpg 等,让用户可以选择图片,而不是其他的文件。