[JQUERY] 캐릭터 라인 화 (JSON로 변환하는) 순환 참조하여 자바 스크립트 객체
JQUERY캐릭터 라인 화 (JSON로 변환하는) 순환 참조하여 자바 스크립트 객체
해결법
-
1.또는 간접적으로 (A -> B -> a) - 직접 객체 자체 인 오브젝트의 속성 (> A A)에있을 때 원형 구조체 오차가 발생한다.
또는 간접적으로 (A -> B -> a) - 직접 객체 자체 인 오브젝트의 속성 (> A A)에있을 때 원형 구조체 오차가 발생한다.
오류 메시지가 나타나지 않도록하기 위해서는 순환 참조가 발생할 때 무엇을 JSON.stringify을 말한다. 당신은 예를 들어, 한 사람이 다른 사람 ( "부모")을 가리키는하는 (또는 수도 없다) 원래 사람을 가리킨 다음을 수행합니다 :
JSON.stringify( that.person, function( key, value) { if( key == 'parent') { return value.id;} else {return value;} })
캐릭터 라인 화하는 두 번째 파라미터는 필터 함수이다. 여기에는 단순히 ID에 언급 된 개체를 변환,하지만 당신은 당신이 순환 참조 휴식을 원하는대로 할 무료입니다.
당신은 다음에 위의 코드를 테스트 할 수 있습니다 :
function Person( params) { this.id = params['id']; this.name = params['name']; this.father = null; this.fingers = []; // etc. } var me = new Person({ id: 1, name: 'Luke'}); var him = new Person( { id:2, name: 'Darth Vader'}); me.father = him; JSON.stringify(me); // so far so good him.father = me; // time travel assumed :-) JSON.stringify(me); // "TypeError: Converting circular structure to JSON" // But this should do the job: JSON.stringify(me, function( key, value) { if(key == 'father') { return value.id; } else { return value; }; });
이 예약 된 다양한 언어로 단어 (그리고 DOM에이)이기 때문에 BTW, 나는 "부모"에 다른 속성의 이름을 선택 것입니다. 이 길 아래에 혼란을 야기하는 경향이 ...
-
2.그 도장이 형태로 JSON에 순환 참조를 나타낼 수 있습니다 나타납니다 : { "ID": "1", "나": { "$ REF": "1"}}
그 도장이 형태로 JSON에 순환 참조를 나타낼 수 있습니다 나타납니다 : { "ID": "1", "나": { "$ REF": "1"}}
다음은 그 예이다 :
http://jsfiddle.net/dumeG/
require(["dojox/json/ref"], function(){ var me = { name:"Kris", father:{name:"Bill"}, mother:{name:"Karen"} }; me.father.wife = me.mother; var jsonMe = dojox.json.ref.toJson(me); // serialize me alert(jsonMe); });
생성합니다 :
{ "name":"Kris", "father":{ "name":"Bill", "wife":{ "name":"Karen" } }, "mother":{ "$ref":"#father.wife" } }
참고 : 당신은 또한 드 직렬화 dojox.json.ref.fromJson 방법을 사용하여 이러한 순환 참조 된 객체.
기타 리소스 :
순환 참조가있는 경우에도 어떻게 JSON에 DOM 노드를 직렬화?
JSON.stringify는 순환 참조를 나타낼 수 없습니다
-
3.I는 JSON 원형 참조를 처리하는 두 적합한 모듈을 알았다.
I는 JSON 원형 참조를 처리하는 두 적합한 모듈을 알았다.
이들 중 하나는 당신의 필요를 충족해야한다.
-
4.내가 페이지에 복잡한 객체를 기록 할 필요가 있었기 때문에 원격 디버깅 내 특정 상황에서는 불가능 이후,이 스레드에 일어났다. 그들이 분석 한 후 다시 연결할 수있는 문자열과 같은 순환 참조를 주석 더글러스 크록 포드의 (JSON의 inceptor) 자신의 cycle.js을 발견했다. 탈 순환 전체 복사본이 작업은 JSON.stringify을 통과하는 것이 안전합니다. 즐겨!
내가 페이지에 복잡한 객체를 기록 할 필요가 있었기 때문에 원격 디버깅 내 특정 상황에서는 불가능 이후,이 스레드에 일어났다. 그들이 분석 한 후 다시 연결할 수있는 문자열과 같은 순환 참조를 주석 더글러스 크록 포드의 (JSON의 inceptor) 자신의 cycle.js을 발견했다. 탈 순환 전체 복사본이 작업은 JSON.stringify을 통과하는 것이 안전합니다. 즐겨!
https://github.com/douglascrockford/JSON-js
-
5.대체물 아래의 사용 (유사 JSON 경로) / 원형 참조 된 개체를 복제하는 문자열 참조와 JSON 생성
대체물 아래의 사용 (유사 JSON 경로) / 원형 참조 된 개체를 복제하는 문자열 참조와 JSON 생성
let s = JSON.stringify(obj, refReplacer());
refReplacer 함수 () { m은 = 새지도 (), V는 새로운지도를 () =하자, 초기화 = NULL; 창 함수 (필드 값) { p = m.get (이) + (Array.isArray (이)를 '[$ {} 필드]'? '.'+ 필드)하자; isComplex하자 = 값 === 객체 (값) 경우 (isComplex) m.set (값, P); PP = v.get (값)을 보자 || '; 하자 경로 = p.replace (미정 / \ \ /, ''..?); 발 = 쪽을 보자? #REF '$ {PP [0] =='[ '? '$': '$.'} $ {PP}`: 값; ! init을? (INIT = 값) : (브로 === INIT 브로 = "#의 REF : $": 0); 만약 v.set (값, 경로) (PP isComplex &&!); 발을 반환; } } // --------------- // 테스트 // --------------- 중복 참조가 // 세대 OBJ A = {1, A2 : A1 2}하자; B = {B1 : 3, B2 : "4"}하자; OBJ = {O1을 {를 O2 : A}, B, A}하자; // 중복 참조 a.a3 = [1,2, B] // 순환 참조 b.b3 = A; // 순환 참조 들 (refReplacer (), 4- OBJ)를 JSON.stringify =하자; CONSOLE.LOG (S);
그리고 그러한 "REF-JSON"에서 중생 객체에 대한 파서 기능 다음
함수 parseRefJSON JSON () { objToPath 새로운지도를 () =하자; ) (pathToObj 새로운지도 =하자; O = JSON.parse JSON ()을 보자; {트래버스 = (부모 필드) =>를 보자 = 부모 OBJ하자; 경로 = '# REF를 : $'를 보자; (필드! == 정의되지 않은) 경우에 { 부모 = OBJ [분야]; 경로 = objToPath.get (부모) + (Array.isArray (부모) '[$ {} 필드]': '$ {필드 + 필드?'. '' '}?'); } objToPath.set (OBJ 경로); pathToObj.set (경로 OBJ); REF = pathToObj.get (OBJ)를 보자; 경우 (REF) 부모 [분야] = (REF); 대한 (하자 F에서 OBJ) 경우 (OBJ === 객체 (OBJ)) 트래버스 (OBJ, F); } 트래버스 (O); O를 반환; } // ------------ // 테스트 // ------------ {`= S를하자 "O1": { "O2": { "A1"(1) "A2": 2, "A3": 1, 2, { "B1"3 "B2": "4", "B3": "# REF :. $ o1.o2" } ] } }, "B": "# REF :. $ o1.o2.a3 [2]" "A": "# REF :. $ o1.o2" }`; 을 console.log ( '열기 크롬 콘솔은 중첩 된 필드를 볼 수 있습니다 :'); 하자 OBJ = parseRefJSON (들); CONSOLE.LOG (OBJ);
-
6.나는이 순환 참조를 제거하려면 다음을 사용 :
나는이 순환 참조를 제거하려면 다음을 사용 :
JS.dropClasses = function(o) { for (var p in o) { if (o[p] instanceof jQuery || o[p] instanceof HTMLElement) { o[p] = null; } else if (typeof o[p] == 'object' ) JS.dropClasses(o[p]); } }; JSON.stringify(JS.dropClasses(e));
from https://stackoverflow.com/questions/10392293/stringify-convert-to-json-a-javascript-object-with-circular-reference by cc-by-sa and MIT license
'JQUERY' 카테고리의 다른 글
[JQUERY] 타이머와 jQuery를 / Ajax 호출 (0) | 2020.10.23 |
---|---|
[JQUERY] 어떻게 배열에서 임의의 요소의 수를 얻으려면? (0) | 2020.10.22 |
[JQUERY] 이미지가 주어진 URL에 존재하는지 확인하는 방법? (0) | 2020.10.22 |
[JQUERY] jQuery를 $ 아약스를 통해 PHP로 자바 스크립트 배열을 전달 (0) | 2020.10.22 |
[JQUERY] DIV 변화에 대한 화재의 jQuery 이벤트 (0) | 2020.10.22 |