//用obj对象生成JSON let Dump = function(obj) { let __A__=[] let __N__ = 0 console.log(">>>>>>>>>>>") //把Function转换成Object便于生成JSON { let _CONVERT_ = {} let convFunc = (obj)=>{ if (obj==null){return null} if (typeof obj != "function"){return obj} if (_CONVERT_[obj]) {return _CONVERT_[obj]} let ret = {} _CONVERT_[obj] = ret for (var k in obj){ if(Object.prototype.hasOwnProperty.call(obj, k)){ ret[k] = obj[k] } } return ret } let _CHANGE_LIST_ = [] let _CHANGE_INDEX_ = 0 let _CHANGE_ = {} let FuncToObj = function(obj, deep=0){ if (obj==null){return null} if (deep==0) {return obj} if (typeof obj != "object"){return obj} if (_CHANGE_LIST_.includes(obj)){return _CHANGE_[obj["__json_id__"]]} let src = {} obj["__json_id__"] = _CHANGE_INDEX_ _CHANGE_[_CHANGE_INDEX_]=src _CHANGE_INDEX_++ for (var k in obj){ if(Object.prototype.hasOwnProperty.call(obj, k)){ src[k] = FuncToObj(convFunc(obj[k]), deep-1) } } return src } obj = FuncToObj(obj, 1) _CHANGE_LIST_.forEach((val)=>{ if (val["__json_id__"]){ delete val["__json_id__"] } }) } //处理了循环引用的JSON let str= JSON.stringify(obj, (k, v) => { // if (k==""){return v} if (v==null){return null} // if (k=="__A__"){return undefined} // if (k=="__S__"){return undefined} // if (k=="__N__"){return undefined} // if (k=="__json_stop__"){return undefined} if (typeof v == "object"){ if (v["__json_stop__"]){return undefined} if (__A__.includes(v)) { return {__json_id__:v["__json_id__"], __json_stop__:true} } __N__++ v["__json_id__"] = __N__ __A__.push(v) return v }else{ return v } }) //清理生成JSON的时候加的标记 __A__.forEach((val)=>{ if (val["__json_id__"]){ delete val["__json_id__"] } }) return str } //把JSON反序列化成Object let Parse = function(str) { let dict = {} //反序列化JSON并标记引用 let ret = JSON.parse(str, (k, v) => { // console.log("k",k) // console.log("v",v) if (v==null){return v} if (typeof v == "object"){ if (v["__json_stop__"]){return v} dict[v["__json_id__"]]=v } return v }) //重建引用 let reIndex = (obj)=>{ if (!!!obj){return} if (typeof obj != "object"){return} for (var k in obj){ if(Object.prototype.hasOwnProperty.call(obj, k)){ if (typeof obj[k] == "object" && obj[k]!=null){ if (obj[k]["__json_stop__"]){ obj[k] = dict[obj[k]["__json_id__"]] }else{ reIndex(obj[k]) } } } } } reIndex(ret) //清理生成JSON的时候加的标记 for (var k in dict){ if(Object.prototype.hasOwnProperty.call(dict, k)){ delete dict[k]["__json_id__"] } } return ret }